diff --git a/messages/ru.json b/messages/ru.json new file mode 100644 index 000000000..c7655e83b --- /dev/null +++ b/messages/ru.json @@ -0,0 +1,14098 @@ +{ + "common": { + "listCapped": "Показаны последние {count}; более ранние записи здесь не перечислены.", + "save": "Сохранить", + "conflictReloaded": "Перезагружено с сервера. Внесите изменение снова.", + "cancel": "Отмена", + "delete": "Удалить", + "undo": "Отменить", + "edit": "Изменить", + "moreOptions": "Ещё", + "create": "Создать", + "close": "Закрыть", + "loading": "Загрузка…", + "loadFailed": "Не удалось загрузить", + "error": "Ошибка", + "saved": "Сохранено", + "pullToRefresh": "Обновление…", + "no": "Нет", + "noData": "Нет данных", + "optional": "Необязательно", + "active": "Активно", + "inactive": "Неактивно", + "disabled": "Выключено", + "networkError": "Ошибка сети", + "openDatePicker": "Открыть выбор даты", + "openTimePicker": "Открыть выбор времени", + "hours": "Часы", + "minutes": "Минуты", + "feet": "фут", + "inches": "дюйм", + "heightFeet": "Рост в футах", + "heightInches": "Рост в дюймах", + "period": "AM/PM", + "am": "AM", + "pm": "PM", + "unknownError": "Неизвестная ошибка", + "copied": "Скопировано!", + "or": "или", + "unknown": "Неизвестно", + "add": "Добавить", + "import": "Импорт", + "test": "Проверить", + "reset": "Сбросить", + "copy": "Копировать", + "copyDetails": "Копировать подробности", + "retry": "Повторить", + "showPassword": "Показать пароль", + "hidePassword": "Скрыть пароль", + "learnMore": "Подробнее", + "dismiss": "Закрыть", + "moreInfo": "Больше информации", + "durationHoursMinutes": "{hours} ч {minutes} мин", + "durationMinutes": "{minutes} мин", + "durationClockMinutes": "{time} мин", + "durationClockHours": "{time} ч", + "errorIdLabel": "ID ошибки", + "errorIdCopy": "Копировать ID ошибки", + "errorIdCopied": "ID ошибки скопирован", + "readThrottled": "Сейчас слишком много запросов, попробуйте позже.", + "sessionEnded": "Сеанс завершён, войдите снова, чтобы продолжить.", + "signIn": "Вход" + }, + "apiErrors": { + "measurement": { + "create": { + "invalid": "Проверьте данные измерения и попробуйте снова." + }, + "duplicate_timestamp": "Измерение на это время уже есть." + }, + "mood": { + "list": { + "invalid": "Фильтры списка настроений некорректны." + }, + "create": { + "invalid": "Проверьте запись настроения и попробуйте снова." + }, + "update": { + "invalid": "Проверьте запись настроения и попробуйте снова." + }, + "duplicate_timestamp": "Запись настроения на это время уже есть.", + "not_found": "Эта запись настроения больше недоступна.", + "ratedFactor": { + "out_of_range": "Оценка фактора выходит за допустимый диапазон." + } + }, + "labs": { + "create": { + "invalid": "Проверьте результат анализа и попробуйте снова." + }, + "result": { + "notFound": "Этот результат анализа больше недоступен." + }, + "biomarker": { + "notFound": "Этот показатель больше недоступен.", + "duplicate": "Показатель с таким названием уже есть.", + "create": { + "invalid": "Проверьте данные показателя и попробуйте снова." + }, + "update": { + "invalid": "Проверьте данные показателя и попробуйте снова.", + "referenceRangeInvalid": "Нижняя граница референсного диапазона не должна превышать верхнюю." + } + }, + "update": { + "invalid": "Проверьте результат анализа и попробуйте снова.", + "linkedFieldsImmutable": "Измените показатель, чтобы поменять его название, единицу, панель или референсный диапазон.", + "qualitativeExpected": "Введите текстовый результат для этого качественного измерения.", + "numericExpected": "Введите число для этого числового измерения.", + "referenceRangeInvalid": "Нижняя граница референсного диапазона не должна превышать верхнюю." + } + }, + "onboarding": { + "disclaimer": { + "invalid": "Подтвердите медицинскую оговорку ещё раз." + }, + "tour": { + "invalid": "Не удалось сохранить прогресс тура." + }, + "complete": { + "invalid": "Проверьте данные профиля и попробуйте снова." + }, + "user": { + "notFound": "Не удалось найти ваш аккаунт." + }, + "step": { + "rateLimited": "Слишком много попыток. Подождите и попробуйте снова.", + "invalid": "Не удалось сохранить этот шаг настройки.", + "completed": "Настройка уже завершена.", + "outOfOrder": "Прогресс настройки изменился. Обновите страницу и продолжите.", + "concurrent": "Прогресс настройки изменился. Обновите страницу и продолжите." + } + }, + "profile": { + "update": { + "nothingSaved": "Ничего не сохранено. Проверьте выделенное поле и попробуйте снова.", + "invalidBody": "Не удалось прочитать обновление профиля.", + "emailInUse": "Этот адрес электронной почты уже используется.", + "emailRateLimited": "Слишком много смен адреса электронной почты. Попробуйте позже.", + "emailSecondFactorRequired": "Подтвердите вторым фактором или ключом доступа, чтобы изменить адрес электронной почты." + } + }, + "auth": { + "reproof": { + "required": "Подтвердите текущий пароль, чтобы изменить это.", + "failed": "Не подтверждено. Ничего не изменено." + } + }, + "biomarkers": { + "unit": { + "locked": "У этого показателя уже есть измерения, поэтому единицу изменить нельзя. Сохранённые значения были бы показаны в новой единице без пересчёта." + } + }, + "symptoms": { + "definition": { + "limitReached": "У вас 8 симптомов. Скрывайте один, чтобы добавить другой.", + "notFound": "Этот симптом больше не существует." + }, + "episode": { + "notOpen": "Это заболевание больше не открыто. Выберите другое или «нет»." + }, + "event": { + "notFound": "Эта запись больше не существует." + } + }, + "medications": { + "notFound": "Это лекарство больше недоступно.", + "ingredients": { + "invalid": "Проверьте состав и попробуйте снова.", + "unitMismatch": "Эта единица не предлагается для нутриента.", + "extract": { + "fileType": "Загрузите JPEG, PNG, WebP или PDF.", + "fileTooLarge": "Файл больше 10 МБ.", + "rateLimited": "Слишком много чтений этикеток. Попробуйте через час.", + "budgetExceeded": "Дневной лимит использования ИИ исчерпан.", + "failed": "Не удалось прочитать этикетку. Попробуйте более чёткое фото." + } + } + }, + "aiRuns": { + "readerBusy": "Средство чтения документов занято другой работой. Попробуйте через минуту." + } + }, + "doctorReport": { + "title": "Отчёт о здоровье", + "anamnesisTitle": "Профиль здоровья", + "anamnesisNotRecorded": "Не записано", + "anamnesisUnreadable": "Не удалось прочитать сохранённое значение", + "anamnesisConditions": "Хронические заболевания", + "anamnesisSmoking": "Статус курения", + "anamnesisAlcohol": "Характер употребления алкоголя", + "anamnesisShiftSchedule": "График работы", + "anamnesisColFact": "Пункт профиля", + "anamnesisColValue": "Записанное значение", + "subtitle": "HealthLog: личный отчёт о здоровье", + "patient": "Пациент", + "dateOfBirth": "Дата рождения", + "gender": "Пол", + "genderMale": "Мужской", + "genderFemale": "Женский", + "genderOther": "Небинарный", + "height": "Рост", + "period": "Отчётный период", + "createdOn": "Создано", + "emergency": { + "title": "Экстренная информация", + "subtitle": "Для использования в острой ситуации. Со слов пациента; по возможности подтвердите.", + "none": "Не записано", + "unreadable": "Не удалось прочитать сохранённое значение", + "bloodType": "Группа крови", + "bloodTypeUnknown": "Неизвестно", + "bloodTypeValues": { + "A_POS": "A положительная", + "A_NEG": "A отрицательная", + "B_POS": "B положительная", + "B_NEG": "B отрицательная", + "AB_POS": "AB положительная", + "AB_NEG": "AB отрицательная", + "O_POS": "O положительная", + "O_NEG": "O отрицательная" + }, + "severeAllergies": "Тяжёлые аллергии", + "activeMedications": "Текущие лекарства", + "chronicConditions": "Хронические заболевания", + "implants": "Импланты и устройства", + "advanceDirective": "Заранее данное распоряжение", + "advanceDirectiveValues": { + "EXISTS": "Есть", + "NONE": "Нет", + "UNKNOWN": "Не указано" + }, + "organDonor": "Донор органов", + "organDonorValues": { + "YES": "Да", + "NO": "Нет", + "UNKNOWN": "Не указано" + }, + "contacts": "Экстренные контакты", + "notes": "Дополнительные заметки" + }, + "vitalsTitle": "Показатели жизнедеятельности: сводка", + "colParameter": "Параметр", + "colCurrent": "Текущее", + "colAvgPeriod": "Среднее за период", + "colMin": "Мин", + "colMax": "Макс", + "colN": "n", + "bpClassificationTitle": "АД: классификация ESH (2023)", + "avgBp": "Среднее АД", + "classification": "Классификация", + "bmiTitle": "Индекс массы тела (ИМТ)", + "bmiRow": "ИМТ: {bmi} кг/м², классификация: {class} (ВОЗ)", + "complianceTitle": "Приверженность лечению", + "glp1Title": "Терапия ГПП-1", + "glp1WeightSummary": "Вес за отчётный период: {start} кг → {end} кг ({delta} кг)", + "glp1CurrentDose": "Текущая доза: {value} {unit} (с {since})", + "glp1Compliance": "Приверженность: {taken} / {total} ({rate}%)", + "glp1SideEffectsTitle": "Отмеченные побочные эффекты", + "colGlp1Date": "Дата", + "colGlp1Dose": "Доза", + "colGlp1Note": "Заметка", + "colGlp1SideEffect": "Побочный эффект", + "colMedication": "Лекарство", + "colTaken": "Принято", + "colSkipped": "Пропущено", + "colMissed": "Пропущено", + "colExpected": "Ожидалось", + "colComplianceRate": "Приверженность", + "moodTitle": "Динамика настроения", + "moodSummary": "Среднее {avg} / 5,0, записей: {count}, диапазон {min}–{max}", + "colMood": "Настроение", + "colCount": "Количество", + "colShare": "Доля", + "footerDisclaimer1": "Этот отчёт создан автоматически из самостоятельно отслеживаемых данных и предназначен для поддержки", + "footerDisclaimer2": "беседы врача и пациента. Он не заменяет медицинский диагноз. Корреляции не означают причинно-следственную связь.", + "footerSource": "Источник: HealthLog | Часовой пояс: {timezone} | Создано: {timestamp}", + "unitSteps": "шаги", + "bmiUnderweight": "Недостаточный вес", + "bmiNormal": "Нормальный вес", + "bmiOverweight": "Избыточный вес (предожирение)", + "bmiObeseGrade1": "Ожирение I степени", + "bmiObeseGrade2": "Ожирение II степени", + "bmiObeseGrade3": "Ожирение III степени", + "bpOptimal": "Оптимальное", + "bpNormal": "Нормальное", + "bpHighNormal": "Высокое нормальное", + "bpHypertensionGrade1": "Артериальная гипертензия 1 степени", + "bpHypertensionGrade2": "Артериальная гипертензия 2 степени", + "bpHypertensionGrade3": "Артериальная гипертензия 3 степени", + "moodAwful": "Очень плохое", + "moodBad": "Плохое", + "moodNeutral": "Нейтральное", + "moodGood": "Хорошее", + "moodGreat": "Очень хорошее", + "typeGlucoseFasting": "Глюкоза (натощак)", + "typeGlucosePostprandial": "Глюкоза (после еды)", + "typeGlucoseRandom": "Глюкоза (случайная)", + "typeGlucoseBedtime": "Глюкоза (перед сном)", + "typeGlucoseUnspecified": "Глюкоза (без метки)", + "glucoseClassificationTitle": "Глюкоза крови: референсные диапазоны (ADA 2024 / DDG)", + "glucoseRow": "{label}: среднее {avg} {unit} (цель {rangeMin}–{rangeMax}), {class}", + "glucoseInTarget": "в цели", + "glucoseBelowTarget": "ниже цели", + "glucoseAboveTarget": "выше цели", + "practiceLabel": "Клиника", + "insurer": "Страховщик", + "insuranceNumber": "Номер страховки", + "summaryTitle": "Клиническая сводка", + "summaryReadings": "Записано за {days} дней: {count} измерений по {params} параметрам.", + "summaryTrend": "{label}: последнее {latest} {arrow}", + "summaryAdherence": "Приверженность лечению: {rate}% (взвешенное среднее).", + "chartsTitle": "Графики динамики", + "packageReadme": "Медицинская карта HealthLog\n\nЭтот пакет содержит:\n- report.pdf: отчёт о здоровье для вашего врача.\n- bundle.json: те же данные в виде документа Bundle HL7 FHIR R4, совместимого с ePA.\n\nСоздано с помощью HealthLog.", + "wellnessTitle": "Сводка самочувствия", + "wellnessDisclaimer": "Это описательные баллы самочувствия, рассчитанные по вашим отслеживаемым сигналам (0–100). Они не являются клинической оценкой или диагнозом.", + "wellnessRecovery": "Восстановление", + "wellnessStress": "Стресс", + "wellnessStrain": "Напряжение", + "cycleTitle": "Менструальный цикл", + "cycleLmp": "Последняя менструация", + "cycleAvgLength": "Средняя длина цикла", + "cycleAvgPeriod": "Средняя длительность менструации", + "cyclePhase": "Текущая фаза", + "cycleDays": "дней", + "cycleColStart": "Начало менструации", + "cycleColLength": "Длина цикла (дней)", + "cycleColPeriod": "Длительность менструации (дней)", + "cyclePhases": { + "MENSTRUAL": "Менструальная", + "FOLLICULAR": "Фолликулярная", + "OVULATORY": "Овуляторная", + "LUTEAL": "Лютеиновая" + }, + "labsTitle": "Результаты анализов", + "labsColAnalyte": "Показатель", + "labsColValue": "Значение", + "labsColReference": "Референс", + "labsColStatus": "Статус", + "labsColDate": "Дата", + "glucoseClinical": { + "title": "Обзор глюкозы (клинический)", + "colMetric": "Показатель", + "colValue": "Значение", + "tirInRange": "Время в диапазоне ({low}–{high} {unit})", + "tirLow": "Низкий (< {low} {unit})", + "tirVeryLow": "Очень низкий (< {veryLow} {unit})", + "tirHigh": "Высокий (> {high} {unit})", + "tirVeryHigh": "Очень высокий (> {veryHigh} {unit})", + "mean": "Средняя глюкоза", + "gmi": "Индикатор управления глюкозой (GMI)", + "eA1c": "Расчётный A1C", + "cv": "Вариабельность (CV%)", + "spotCaveat": "Это оценки по отдельным измерениям, а не профиль непрерывного мониторинга. Читайте их как направление движения, а не как клинический вердикт." + }, + "illnessTitle": "Состояния и заболевания", + "illnessOngoing": "Продолжается", + "illnessColCondition": "Состояние", + "illnessColBodySite": "Область тела", + "illnessColType": "Тип", + "illnessColLifecycle": "Курс", + "illnessColOnset": "Начало", + "illnessColResolved": "Завершено", + "allergiesTitle": "Аллергии и непереносимости", + "reactionUnreadable": "Реакция записана, но не удалось расшифровать", + "allergiesColSubstance": "Вещество", + "allergiesColCategory": "Категория", + "allergiesColKind": "Вид", + "allergiesColSeverity": "Тяжесть", + "allergiesColReaction": "Реакция", + "allergiesColStatus": "Статус", + "familyHistoryTitle": "Семейный анамнез", + "familyHistoryColRelationship": "Родственник", + "familyHistoryColCondition": "Состояние", + "familyHistoryColAgeAtOnset": "Возраст начала", + "labsSourceRangeNote": "* Референсный диапазон взят из самого отчёта и отличается от сохранённого:", + "labsCatalogRangeLabel": "сохранённый диапазон", + "visitsTitle": "Визиты", + "visitsColDate": "Дата", + "visitsColPractice": "Клиника", + "visitsColKind": "Вид", + "visitsColReason": "Причина", + "visitsColOutcome": "Исход", + "visitsColConditions": "Состояния", + "surgicalHistoryTitle": "История операций", + "surgicalHistoryColDate": "Дата", + "surgicalHistoryColProcedure": "Процедура", + "surgicalHistoryColBodySite": "Область тела", + "surgicalHistoryColOutcome": "Исход", + "immunizationsTitle": "Вакцинации", + "immunizationsColDate": "Дата", + "immunizationsColVaccine": "Вакцина", + "immunizationsColDose": "Доза", + "immunizationsColLot": "Серия", + "courseRange": "Курс {start} — {end}", + "courseSince": "Курс с {start}", + "lifePackYears": "Пачко-годы", + "lifeAuditC": "AUDIT-C (скрининг)", + "lifeAuditCScore": "{score} из 12 на {date}.", + "lifeAuditCAbove": "На уровне порога {cutoff} или выше ({source}).", + "lifeAuditCBelow": "Ниже порога {cutoff} ({source}).", + "lifeAuditCNoCutoff": "Порог по полу не применялся.", + "lifeActivity": "Физическая активность", + "lifeActivityValue": "{minutes} минут в неделю, со слов пациента", + "lifeSitting": "Сидение в рабочий день", + "lifeSittingValue": "{hours} часов, со слов пациента", + "lifeWork": "Работа", + "lifeNightWork": "ночная работа", + "lifeExposures": "воздействия: {list}", + "workouts": { + "title": "Тренировки", + "summary": "{sessions} сеансов, всего {hours} ч; в среднем {perWeek} сеансов и {minutesPerWeek} минут в неделю.", + "colSport": "Вид спорта", + "colSessions": "Сеансы", + "colTime": "Время", + "colDistance": "Расстояние", + "colEnergy": "Энергия", + "colHeartRate": "Средняя ЧСС", + "moreSports": "Ещё {count} видов спорта учтены в итогах, но не перечислены." + }, + "medicationEffect": { + "title": "Изменение вокруг начала каждого лекарства", + "colMedication": "Лекарство / показатель", + "colStart": "Начало", + "colLevel": "Изменение уровня (95 % ДИ)", + "colSlope": "Изменение динамики (95 % ДИ)", + "colDays": "Дней до / после", + "to": "до", + "week": "неделя", + "reasonNoStart": "Дата начала не записана", + "reasonBefore": "Слишком мало измерений до начала", + "reasonAfter": "Слишком мало измерений после начала", + "reasonFit": "Не удалось вычислить", + "excludedAdherence": "{count} дней после начала исключены (принято менее {floor} % доз)", + "excludedNotTaking": "{count} дней исключены (пауза или между курсами)", + "notTracked": "приём не отслеживается, поэтому дни пропущенных доз не исключались", + "endDoseChange": "окно заканчивается {date}, до первого изменения дозы", + "days": "{before} дней до, {after} дней после начала, {excluded} дней исключено", + "method": "Сегментированная регрессия по дневным значениям с 90 дней до начала и не более 180 дней после, с интервалами Ньюи–Уэста. Дни после начала, в которые принято менее 80 % доз за предыдущие 14 дней, исключаются. Описывает связь во времени, а не доказанный эффект лекарства.", + "autocorrelation": "сильный перенос день ото дня, поэтому диапазоны могут быть всё ещё слишком узкими", + "window": "проанализировано с {from} по {to}, что может выходить за отчётный период", + "windowLine": "Проанализировано с {from} по {to}. Это окно может выходить за отчётный период." + }, + "screenerUnvalidated": "{label}: {count} из {total} результатов даны в переводе, не прошедшем научную валидацию; считайте их ориентировочными." + }, + "errorBoundary": { + "title": "Что-то пошло не так", + "description": "Произошла непредвиденная ошибка. Можно повторить, скопировать технические подробности или открыть сообщение об ошибке." + }, + "notFound": { + "title": "Этой страницы не существует.", + "backToDashboard": "Назад к сводке" + }, + "offlineBanner": { + "message": "Нет подключения: изменения нельзя сохранить, пока вы снова не в сети.", + "saveFailed": "Не удалось сохранить, вы не в сети. Попробуйте снова, когда подключение вернётся.", + "showingCached": "Показаны последние синхронизированные данные." + }, + "demoBanner": { + "message": "Деморежим: изменения не сохраняются." + }, + "nav": { + "dashboard": "Сводка", + "measurements": "Измерения", + "medications": "Лекарства", + "insights": "Аналитика", + "achievements": "Достижения", + "settings": "Настройки", + "admin": "Админ-панель", + "logout": "Выйти", + "login": "Вход", + "notifications": "Уведомления", + "theme": "Тема", + "themeSystem": "Системная", + "themeDark": "Тёмная", + "themeLight": "Светлая", + "collapseSidebar": "Свернуть", + "expandSidebar": "Развернуть", + "collapseSidebarLabel": "Свернуть боковую панель", + "expandSidebarLabel": "Развернуть боковую панель", + "userMenu": "Меню пользователя", + "accountSettings": "Настройки аккаунта", + "mood": "Настроение", + "coach": "Тренер", + "skipToContent": "Перейти к содержимому", + "breadcrumb": "Вы здесь", + "sidebar": "Боковая панель", + "mainNavigation": "Основная навигация", + "mobileNavigation": "Мобильная навигация", + "loadingScreen": "Загрузка…", + "more": "Ещё", + "moreSheetTitle": "Ещё", + "moreSheetDescription": "Перейти к остальным разделам HealthLog.", + "capture": { + "title": "Записать", + "description": "Что вы хотите записать?", + "measurement": "Измерение", + "measurementDescription": "Вес, АД, пульс и другое", + "medication": "Лекарство", + "medicationDescription": "Отметить дозу как принятую", + "mood": "Настроение", + "moodDescription": "Записать настроение и теги", + "workout": "Тренировка", + "workoutDescription": "Сеанс, который не записали ваши устройства", + "symptom": "Симптом", + "symptomDescription": "Один из ваших симптомов с силой", + "lifeEventDescription": "Переезд, рождение ребёнка, новая работа", + "lifeEvent": "Событие жизни" + }, + "cycle": "Цикл", + "labs": "Анализы", + "profile": "Профиль", + "vorsorge": "Чекапы", + "illness": "Заболевания", + "documents": "Документы", + "vaccinations": "Вакцинации", + "mentalWellbeing": "Психическое благополучие", + "timeline": "Хронология" + }, + "auth": { + "login": "Вход", + "register": "Регистрация", + "username": "Имя пользователя", + "password": "Пароль", + "email": "Адрес электронной почты", + "emailPlaceholder": "name@example.com", + "emailOrUsername": "Адрес электронной почты или имя пользователя", + "emailOrUsernamePlaceholder": "name@example.com или имя пользователя", + "loginWithPasskey": "Войти с ключом доступа", + "loginWithPassword": "Войти с паролем", + "noAccount": "Нет аккаунта?", + "hasAccount": "Уже есть аккаунт?", + "loginFailed": "Не удалось войти", + "registerFailed": "Не удалось зарегистрироваться", + "invitedBanner": "Вас пригласили. Создайте аккаунт, даже если регистрация в остальном закрыта.", + "alreadySignedIn": { + "title": "Вы уже вошли", + "body": "Вы вошли как {username}. Приглашение создаёт новый аккаунт. Выйдите, чтобы принять его.", + "signOut": "Выйти и принять приглашение" + }, + "createAccount": "Создать аккаунт", + "backToPasskey": "Назад к ключу доступа", + "passkeySetupLater": "Ключи доступа можно настроить в любой момент в настройках.", + "passwordMinLength": "Мин. 12 символов", + "passwordTooShort": "Пароль должен быть не короче {minLength} символов.", + "privacyPolicy": "Политика конфиденциальности", + "passwordBreached": "Этот пароль встречался в известных утечках данных. Выберите другой.", + "oidc": { + "signInDefault": "Войти через SSO", + "errorDenied": "Вход отменён.", + "errorNoEmail": "Ваш провайдер идентификации не передал подтверждённый адрес электронной почты.", + "errorEmailUnverified": "Ваш провайдер идентификации не отметил адрес электронной почты как подтверждённый.", + "errorIdentityConflict": "Этот адрес электронной почты принадлежит аккаунту, уже связанному с другой идентичностью SSO.", + "errorRegistrationDisabled": "Ни один аккаунт не соответствует этой идентичности, а регистрация сейчас закрыта.", + "errorFailed": "Не удалось войти через единый вход. Попробуйте снова.", + "errorLinkRequired": "Аккаунт с этим адресом электронной почты здесь уже есть. Войдите в него один раз с паролем или ключом доступа, чтобы связать его с единым входом." + }, + "native": { + "signingInToApp": "Вход в приложение HealthLog" + }, + "mfa": { + "title": "Двухфакторная аутентификация", + "totpHint": "Введите 6-значный код из приложения-аутентификатора.", + "recoveryHint": "Введите один из сохранённых кодов восстановления.", + "securityKeyHint": "Используйте зарегистрированный ключ безопасности, чтобы продолжить.", + "codeLabel": "Код аутентификации", + "recoveryLabel": "Код восстановления", + "verify": "Подтвердить", + "verifyFailed": "Не удалось подтвердить. Попробуйте снова.", + "useSecurityKey": "Использовать ключ безопасности", + "useRecoveryCode": "Использовать код восстановления", + "useAuthenticator": "Использовать приложение-аутентификатор", + "backToLogin": "Назад ко входу", + "rememberDevice": "Доверять этому устройству 30 дней" + }, + "enrollMfa": { + "title": "Настройте второй фактор", + "body": "Ваш администратор требует второй фактор для этого аккаунта. Добавьте приложение-аутентификатор или ключ безопасности, чтобы продолжить.", + "signOut": "Выйти" + }, + "confirmAccess": { + "title": "Подтвердите, что это вы", + "body": "Ассистент просит подключиться к вашим данным HealthLog. Подтвердите, что это вы, и вы вернётесь, чтобы решить, разрешить ли это.", + "action": "Подтвердить", + "failed": "Не сработало. Попробуйте снова.", + "nothingToConfirm": "Здесь нечего подтверждать. Начните подключение заново из вашего ассистента." + }, + "insecureTransport": { + "title": "Вход не может завершиться на этой странице", + "body": "Этот сервер устанавливает cookie входа только через https://, а эта страница открыта через http://. Браузер отбросил бы cookie, поэтому вход здесь отключён.", + "fixLan": "Сервер в домашней сети без TLS: задайте SESSION_COOKIE_SECURE=false в его настройках и перезапустите его.", + "fixHttps": "Сервер за HTTPS-прокси: откройте адрес https:// и убедитесь, что прокси передаёт X-Forwarded-Proto: https.", + "localhostNote": "Эта страница на http://localhost, а сервер устанавливает cookie входа только для https://. Большинство браузеров принимают это на localhost; если вход снова возвращает сюда, задайте SESSION_COOKIE_SECURE=false." + }, + "claim": { + "title": "Примите свою медицинскую карту", + "titleNamed": "Добро пожаловать, {name}", + "description": "До сих пор вашу медицинскую карту вели за вас. Выберите способ входа, и она станет вашим собственным аккаунтом. Ничего не копируется и не переносится.", + "loading": "Проверяем вашу ссылку…", + "invalid": "Эта ссылка больше не работает", + "invalidHint": "Она неизвестна, истекла, отозвана или уже использована. Попросите у отправителя новую.", + "oidcOnly": "Этот сервер допускает только единый вход. Продолжите через своего провайдера идентификации.", + "signedInTitle": "Сначала выйдите", + "signedInBody": "Вы вошли как {username}. Эта ссылка настраивает вход для другого человека, поэтому выйдите перед её использованием.", + "signOut": "Выйти и продолжить", + "guardiansTitle": "Кто сохраняет доступ пока что", + "guardiansHint": "Предложено теми, кто вёл вашу карту. Вы решите сразу после входа.", + "guardianUnnamed": "Опекун", + "usernameHint": "От 3 до 30 букв, цифр, _ или -.", + "usernameReserved": "Имена пользователя, начинающиеся с managed-, зарезервированы.", + "emailHint": "Обязательно, чтобы вы могли вернуться, если забудете пароль.", + "consentNote": "Вы сами подтверждаете оговорку и любое использование ИИ. Пока вы этого не сделаете, ничего из вашей карты не отправляется провайдеру ИИ.", + "expires": "Эта ссылка действительна до {date}.", + "submit": "Принять", + "submitting": "Принимаем…", + "errorTaken": "Это имя пользователя или адрес электронной почты уже используется.", + "errorRateLimit": "Слишком много попыток. Подождите несколько минут и попробуйте снова.", + "errorFailed": "Не сработало. Попробуйте через минуту.", + "errorOffline": "Не дошло до сервера. Проверьте подключение и попробуйте снова.", + "ssoContinue": "Продолжить с {provider}", + "ssoStarting": "Перенаправление…", + "ssoHint": "С этого момента вы входите здесь со своим аккаунтом {provider}.", + "ssoDivider": "или", + "ssoFallbackName": "единый вход", + "errorTitle": "Передача не прошла", + "errorSubjectBound": "Этот вход уже принадлежит другому аккаунту на этом сервере. Откройте ссылку снова и используйте другой аккаунт у своего провайдера идентификации.", + "errorEmailTaken": "Ваш провайдер идентификации передал адрес электронной почты, который здесь уже использует другой аккаунт. Откройте ссылку снова и используйте другой аккаунт или обратитесь к администратору сервера.", + "errorUsernameTaken": "Кто-то занял это имя пользователя тем временем. Откройте ссылку снова и выберите другое.", + "errorSignedIn": "Вы были в системе, когда вернулись. Выйдите, затем откройте ссылку снова.", + "errorSso": "Вход через вашего провайдера идентификации не удался. Откройте ссылку снова, чтобы попробовать ещё раз.", + "signInInstead": "Войти в этот аккаунт" + }, + "inviteInvalid": { + "title": "Приглашение недействительно", + "description": "Эта ссылка-приглашение неполная или скопирована с ошибкой. Попросите у пригласившего новую ссылку.", + "toLogin": "Перейти ко входу" + }, + "deletionPending": "Этот аккаунт запланирован к удалению на {date} и заблокирован до тех пор. Администратор этого сервера может отменить удаление до этой даты.", + "deletionPendingNoDate": "Этот аккаунт запланирован к удалению и заблокирован. Администратор этого сервера может отменить удаление до его завершения." + }, + "dashboard": { + "title": "Сводка", + "greeting": { + "morning": "Доброе утро", + "day": "Здравствуйте", + "evening": "Добрый вечер" + }, + "welcomeBack": "{greeting}, с возвращением.", + "welcomeBackWithName": "{greeting}, {name}, с возвращением.", + "greetingSalutation": "Привет, {name}", + "streakLabel": "дней подряд", + "weight": "Вес", + "bloodPressure": "АД", + "pulse": "Пульс", + "bodyFat": "Жировая масса", + "sleep": "Сон", + "steps": "Шаги", + "vo2Max": "VO₂ max", + "vo2MaxUnit": "мл/(кг·мин)", + "bpInTarget": "АД в цели", + "weightShort": "Вес", + "bloodPressureSysShort": "АД (сист.)", + "bloodPressureDiaShort": "АД (диаст.)", + "pulseShort": "Пульс", + "bodyFatShort": "Жировая масса", + "moodShort": "Настроение", + "sleepShort": "Сон", + "stepsShort": "Шаги", + "vo2MaxShort": "VO₂ max", + "bpInTargetWindow90": "АД в цели (90 дн.)", + "bpInTargetWindowDynamic": "АД в цели ({days} дн.)", + "bpInTargetCollecting": "сбор данных", + "medications": "Лекарства", + "quickAddMeasurement": "Записать измерение", + "quickAddMood": "Записать настроение", + "quickAddMedicationIntake": "Записать приём лекарства", + "quickAddWorkout": "Записать тренировку", + "quickAddLifeEvent": "Записать событие жизни", + "customizeDashboard": "Настроить сводку", + "medicationIntakeQuickAdd": { + "sheetDescription": "Запишите дозу, время и лекарство в несколько касаний.", + "medicationLabel": "Лекарство", + "medicationPlaceholder": "Выберите лекарство", + "doseLabel": "Доза", + "dosePlaceholder": "напр. 5 мг", + "doseHint": "Заполнено стандартной дозой. Измените её, чтобы записать отклоняющуюся дозу только для этого приёма.", + "timeLabel": "Время приёма", + "saveError": "Не удалось сохранить приём лекарства.", + "emptyTitle": "Лекарств пока нет", + "emptyDescription": "Сначала создайте лекарство с расписанием, затем вернитесь сюда, чтобы записать приём.", + "emptyCta": "Добавить лекарство", + "noneActionableTitle": "Сегодня принимать нечего", + "noneActionableDescription": "Ваши лекарства на паузе, сохранены как запись, или их курс ещё не начался либо уже закончился. Прошлую дозу всё ещё можно добавить из истории лекарства.", + "noneActionableCta": "Открыть лекарства" + }, + "quickEntryDiscard": { + "title": "Отменить эту запись?", + "description": "У вас есть несохранённый ввод. Закрыть форму и потерять введённое?", + "confirm": "Отменить", + "cancel": "Продолжить ввод" + }, + "compliance7d": "Приверженность (7 дней)", + "mood": "Настроение", + "customizeTitle": "Раскладка сводки", + "heroItemsTitle": "Главное на сегодня", + "heroItemsDescription": "Выберите, какие типы пунктов могут появляться в «Главное на сегодня».", + "heroItemsNotificationNote": "Настройки уведомлений управляются отдельно.", + "heroContentTitle": "Верхняя карточка показывает", + "heroContentScore": "Балл здоровья и сводка дня", + "heroContentReminders": "Главное на сегодня", + "heroItems": { + "coach_checkin": "Проверки коуча", + "dose_window": "Дозы лекарств", + "preventive_care": "Профилактика", + "sync_issue": "Проблемы синхронизации", + "milestone": "Вехи", + "ecg_new_recording": "Новые записи ЭКГ", + "tension_window": "Периоды напряжения", + "same_time_baseline": "Активность в это же время", + "upcoming_visit": "Приёмы" + }, + "layoutReset": "Сбросить к значениям по умолчанию", + "layoutResetTitle": "Сбросить раскладку сводки?", + "layoutResetBody": "Раскладка плиток и выбор «Главное на сегодня» вернутся к значениям по умолчанию.", + "layoutResetConfirm": "Сбросить раскладку", + "layoutSaveSuccess": "Раскладка сводки сохранена", + "layoutSaveError": "Не удалось сохранить раскладку сводки", + "layoutConflictReloaded": "Раскладка перезагружена с сервера. Внесите изменение снова.", + "layoutResetSuccess": "Раскладка сброшена к значениям по умолчанию", + "layoutUsingDefaults": "Используется раскладка по умолчанию", + "layoutCustomized": "Активна своя раскладка", + "moveUp": "Вверх", + "moveDown": "Вниз", + "layoutTileColumn": "Плитка", + "layoutChartColumn": "График", + "layoutNativeOnlyTitle": "Показывается в мобильном приложении", + "layoutNativeOnlyHint": "Эти виджеты рисует мобильное приложение, а не эта страница. Они хранятся в той же раскладке, поэтому их видимость задаётся здесь.", + "dragHandle": "Перетащите, чтобы изменить порядок", + "dragHandleHint": "Перетащите маркер, чтобы изменить порядок виджета. Можно также использовать кнопки со стрелками вверх и вниз или сфокусировать маркер и нажать пробел и стрелки.", + "emptyTitle": "Ваша сводка пуста", + "emptyDescription": "Запишите первое измерение или настроение. Плитки и графики появятся автоматически по мере поступления данных.", + "emptyAddMeasurement": "Добавить первое измерение", + "staleHint": "Последнее измерение {count} дн. назад", + "staleHintWeeksOne": "Последнее измерение 1 неделю назад", + "staleHintWeeksOther": "Последнее измерение {count} недель назад", + "staleHintWeeksFew": "Последнее измерение {count} недели назад", + "staleHintMonthsOne": "Последнее измерение 1 месяц назад", + "staleHintMonthsOther": "Последнее измерение {count} месяцев назад", + "staleHintMonthsFew": "Последнее измерение {count} месяца назад", + "recentWorkouts": { + "title": "Недавние тренировки", + "viewAll": "Показать все", + "empty": { + "title": "Тренировок пока нет", + "cta": "Подключите источник данных в настройках, чтобы видеть тренировки здесь." + } + }, + "metric": { + "title": { + "weight": "Вес", + "bloodPressure": "АД", + "pulse": "Пульс", + "bodyFat": "Жировая масса", + "glucose": "Глюкоза крови", + "sleep": "Сон", + "steps": "Шаги", + "totalBodyWater": "Общая вода в организме", + "boneMass": "Костная масса", + "oxygenSaturation": "Насыщение кислородом", + "mood": "Настроение", + "bmi": "ИМТ" + }, + "unit": { + "weight": "кг", + "bloodPressure": "мм рт. ст.", + "pulse": "уд/мин", + "bodyFat": "%", + "glucose": "мг/дл", + "sleep": "ч", + "steps": "шаги", + "totalBodyWater": "кг", + "boneMass": "кг", + "oxygenSaturation": "%", + "mood": "/5", + "bmi": "кг/м²" + } + }, + "quickAddSymptom": "Записать симптом", + "todayCardVisible": "Показывать верхнюю карточку", + "recoveryKitBanner": { + "title": "Сохраните набор восстановления", + "body": "Без копий ключей, которые использует этот сервер, его данные нельзя восстановить после переустановки. Это займёт несколько минут.", + "action": "Открыть набор" + }, + "greetingOnly": "{greeting}.", + "welcomeNew": "Добро пожаловать.", + "welcomeNewWithName": "Добро пожаловать, {name}." + }, + "measurements": { + "title": "Измерения", + "subtitle": "Записывайте измерения и просматривайте всю историю.", + "addMeasurement": "Добавить", + "editMeasurement": "Изменить измерение", + "type": "Тип", + "value": "Значение", + "date": "Дата", + "source": "Источник", + "notes": "Заметки", + "typeWeight": "Вес", + "typeBloodPressure": "АД", + "typeBpSys": "Сист.", + "typeBpDia": "Диаст.", + "typePulse": "Пульс", + "typeBodyFat": "Жировая масса", + "typeSleep": "Сон", + "typeSteps": "Шаги", + "typeBloodGlucose": "Глюкоза крови", + "typeTotalBodyWater": "Общая вода в организме", + "typeBoneMass": "Костная масса", + "typeOxygenSaturation": "Насыщение кислородом", + "typeHeartRateVariability": "Вариабельность сердечного ритма", + "typeRestingHeartRate": "ЧСС в покое", + "typeActiveEnergyBurned": "Активная энергия", + "typeFlightsClimbed": "Этажи", + "typeWalkingRunningDistance": "Расстояние ходьбы + бега", + "typeVo2Max": "VO₂ max", + "typeBodyTemperature": "Температура тела", + "typeFatFreeMass": "Обезжиренная масса", + "typeFatMass": "Жировая масса", + "typeMuscleMass": "Мышечная масса", + "typeSkinTemperature": "Температура кожи", + "typePulseWaveVelocity": "Скорость пульсовой волны", + "typeVascularAge": "Сосудистый возраст", + "typeVisceralFat": "Висцеральный жир", + "typeAudioExposureEnv": "Воздействие звука (окружение)", + "typeAudioExposureHeadphone": "Воздействие звука (наушники)", + "typeTimeInDaylight": "Время на дневном свете", + "typeWalkingSteadiness": "Устойчивость ходьбы", + "typeAudioExposureEvent": "Событие громкого прослушивания", + "typeRespiratoryRate": "Частота дыхания", + "typeBodyMassIndex": "Индекс массы тела", + "typeLeanBodyMass": "Тощая масса тела", + "typeWalkingHeartRateAverage": "ЧСС при ходьбе (сред.)", + "typeWalkingAsymmetry": "Асимметрия ходьбы", + "typeWalkingDoubleSupport": "Двойная опора при ходьбе", + "typeWalkingStepLength": "Длина шага при ходьбе", + "typeWalkingSpeed": "Скорость ходьбы", + "glucoseContext": "Контекст", + "glucoseContextFasting": "Натощак (≥8 ч без еды)", + "glucoseContextPostprandial": "После еды (через 2 ч)", + "glucoseContextRandom": "Случайно / без привязки", + "glucoseContextBedtime": "Перед сном", + "unitHours": "часы", + "unitSteps": "шаги", + "sourceManual": "Вручную", + "sourceWithings": "Withings", + "sourceImport": "Импорт", + "sourceAppleHealth": "Apple Health", + "systolicLabel": "Систолическое (мм рт. ст.)", + "diastolicLabel": "Диастолическое (мм рт. ст.)", + "pulseLabel": "Пульс (уд/мин)", + "valueWithUnit": "Значение ({unit})", + "timestamp": "Время", + "timestampBackdateHint": "Измените дату и время, чтобы записать прошлое измерение.", + "notesPlaceholder": "напр. после еды", + "formReset": "Сбросить форму", + "saveError": "Ошибка сохранения", + "duplicateTimestamp": "Измерение этого типа на выбранное время уже есть.", + "serverOwnedSource": "Значения из подключённого источника нельзя изменить, но время и заметка остаются редактируемыми.", + "deleteError": "Ошибка удаления", + "deletedToast": "Измерение удалено", + "restoredToast": "Измерение восстановлено", + "restoreError": "Не удалось восстановить", + "invalidValue": "Введите корректное значение.", + "invalidTimestamp": "Выберите корректное время.", + "loginRequired": "Войдите, чтобы просматривать измерения.", + "allTypes": "Все типы", + "measurementCount": "{count} измерений", + "emptyTitle": "Измерений пока нет", + "emptyDescription": "Записывайте вес, АД, пульс или другие показатели, чтобы начать отслеживать динамику.", + "emptyFilteredTitle": "Нет измерений по этому фильтру", + "emptyFilteredDescription": "Попробуйте другой тип или очистите фильтр, чтобы увидеть все измерения.", + "emptyAddFirst": "Добавить первое измерение", + "emptyResetFilter": "Показать все типы", + "comment": "Комментарий", + "actions": "Действия", + "deleteConfirmTitle": "Удалить измерение?", + "deleteConfirmDescription": "Это измерение будет удалено. В течение короткого времени это можно отменить.", + "pageInfo": "Страница {page} из {total}", + "previousPage": "Предыдущая страница", + "nextPage": "Следующая страница", + "dailyTotalCaption": "({count} образцов)", + "openMetricInsights": "Открыть аналитику {type}", + "sleepNapCaption": "вкл. {count} дневной сон", + "sleepAwakeningsCaption": "{count} пробуждений", + "expandDay": "Показать образцы за этот день", + "collapseDay": "Скрыть образцы за этот день", + "loadError": "Не удалось загрузить измерения.", + "typeCardioRecovery": "Кардиовосстановление", + "typeWristTemperature": "Температура запястья", + "typeFallCount": "Падения", + "typeSixMinuteWalkDistance": "Дистанция шестиминутной ходьбы", + "typeStairAscentSpeed": "Скорость подъёма по лестнице", + "typeStairDescentSpeed": "Скорость спуска по лестнице", + "typeBreathingDisturbances": "Нарушения дыхания во сне", + "typeIrregularRhythmNotification": "Уведомление о нерегулярном ритме", + "typeHighHeartRateEvent": "Уведомление о высокой ЧСС", + "typeLowHeartRateEvent": "Уведомление о низкой ЧСС", + "typeWalkingSteadinessEvent": "Оповещение об устойчивости ходьбы", + "typeBreathingDisturbanceEvent": "Нарушение дыхания", + "typeRecoveryScore": "Балл восстановления", + "typeStressScore": "Балл стресса", + "typeStrainScore": "Балл напряжения", + "typeHrvRmssd": "HRV (RMSSD)", + "typeDayStrain": "Напряжение дня", + "typeWorkoutStrain": "Напряжение тренировки", + "typeSleepPerformance": "Качество сна", + "typeSleepEfficiency": "Эффективность сна", + "typeSleepConsistency": "Постоянство сна", + "typeSleepNeed": "Потребность во сне", + "typeEnergyExpenditureKj": "Расход энергии", + "typeAverageHeartRate": "Средняя ЧСС", + "typeMaxHeartRate": "Максимальная ЧСС", + "typeSleepDisturbanceCount": "Нарушения сна", + "typeAnsCharge": "Заряд ВНС", + "typeCardioLoad": "Кардионагрузка", + "typeSleepScore": "Балл сна", + "typeBodyTemperatureDeviation": "Отклонение температуры тела", + "typeResilience": "Устойчивость", + "sourceComputed": "Вычислено", + "sourceWhoop": "WHOOP", + "sourceFitbit": "Fitbit", + "sourceNightscout": "Nightscout", + "sourcePolar": "Polar", + "sourceOura": "Oura", + "sourceTelegram": "Telegram", + "sourceMcp": "MCP", + "sourceGoogleHealth": "Google Health", + "sourceStrava": "Strava", + "sourceExternal": "Внешнее устройство", + "bulkDeleteSuccess": "{count} измерений удалено", + "bulkDeleteSuccessOne": "Измерение удалено", + "bulkDeleteError": "Ошибка удаления выбранных измерений", + "bulkDeleteConfirmTitle": "Удалить {count} измерений?", + "bulkDeleteConfirmTitleOne": "Удалить это измерение?", + "bulkDeleteConfirmBody": "Выбранные измерения ({count}) будут удалены. В течение короткого времени это можно отменить.", + "bulkDeleteConfirmBodyOne": "Выбранное измерение будет удалено. В течение короткого времени это можно отменить.", + "typePhq9Score": "Балл PHQ-9", + "typeGad7Score": "Балл GAD-7", + "typeGripStrength": "Сила хвата", + "typePainNrs": "Боль (0–10)", + "typeWaistCircumference": "Окружность талии", + "typeWaistToHeight": "Отношение талии к росту", + "unitScore": "баллы", + "unitRatio": "отношение", + "unitRating": "рейтинг", + "typeWho5Score": "Балл WHO-5", + "typeSciScore": "Балл SCI", + "typeExerciseMinutes": "Минуты упражнений", + "typeStandMinutes": "Минуты стояния", + "typeStandHours": "Часы стояния", + "typeMindfulMinutes": "Минуты осознанности", + "typeStateOfMindValence": "Состояние души", + "typeAfibBurden": "Бремя фибрилляции предсердий", + "typeIndoorCo2": "CO₂ в помещении", + "typeIndoorTemperature": "Температура в помещении", + "typeIndoorHumidity": "Влажность в помещении", + "durationReadAs": "Читается как {duration}", + "durationHoursMinutes": "{hours} ч {minutes} мин", + "durationHoursOnly": "{hours} ч", + "durationMinutesOnly": "{minutes} мин", + "durationInvalid": "Введите длительность, например 7,5, 7:30 или 7ч 30м.", + "durationTooLong": "Одна запись не может быть длиннее 24 часов.", + "sourceHealthConnect": "Health Connect" + }, + "metricCatalog": { + "title": "Что умеет отслеживать HealthLog", + "description": "Все области показателей, которые поддерживает HealthLog, есть ли у вас уже данные по ним и что их поставляет.", + "statusPresent": "Отслеживается", + "statusAbsent": "Пока не отслеживается", + "statusModuleOff": "Выкл.", + "loadError": "Не удалось загрузить статус отслеживания.", + "connectCta": "Подключить источник", + "viewCta": "Открыть", + "ecg": { + "source": "Одноканальные ЭКГ-полосы с совместимых часов (сейчас Withings ScanWatch), синхронизируются автоматически." + }, + "watchdog": { + "title": "Автоматический скрининг", + "description": "HealthLog также тихо следит в фоне: уведомления о нерегулярном ритме и нарушениях дыхания с подключённых часов, оповещения о дрейфе базового уровня и заметные сдвиги между двумя последними панелями анализов. Карточка появляется, только когда что-то выделяется. Если подключён хотя бы один из этих источников, отсутствие карточки — хороший знак, а не пропущенная функция; если не подключён ни один, просто нечего отслеживать." + } + }, + "mood": { + "title": "Настроение", + "subtitle": "Дневник настроения и записи", + "mentalWellbeingLink": "Пройти проверку психического благополучия", + "addEntry": "Добавить", + "editEntry": "Изменить запись", + "moodLevel": "Настроение", + "heroQuestion": "Как вы?", + "factorYes": "Да", + "factorNo": "Нет", + "factorRatingOption": "{label}: {value} из {max}", + "tags": "Теги", + "tagsPlaceholder": "напр. Спорт, Работа, Семья", + "tagsHelp": "Через запятую", + "timestamp": "Время", + "date": "Дата", + "source": "Источник", + "levelSuperGut": "Отлично", + "levelGut": "Хорошо", + "levelOkay": "Нормально", + "levelSchlecht": "Плохо", + "levelLausig": "Ужасно", + "sourceMoodlog": "moodLog", + "allMoods": "Все настроения", + "entryCount": "Записей: {count}", + "emptyTitle": "Записей настроения пока нет", + "emptyDescription": "Записывайте, как вы себя чувствуете сегодня, чтобы замечать закономерности со временем.", + "emptyFilteredTitle": "Нет записей настроения по этому фильтру", + "emptyFilteredDescription": "Попробуйте другой уровень настроения или очистите фильтр, чтобы увидеть все записи.", + "emptyAddFirst": "Записать первое настроение", + "emptyResetFilter": "Показать все настроения", + "actions": "Действия", + "formReset": "Сбросить форму", + "noteCharCount": "{count}/{max}", + "formResetConfirmTitle": "Сбросить эту форму?", + "formResetConfirmBody": "Это очистит введённые настроение, теги и заметку. Отменить это нельзя.", + "formResetConfirmAction": "Сбросить", + "saveError": "Ошибка сохранения", + "tagsNotSaved": "Сохранено. Недоступные теги были опущены.", + "deleteError": "Ошибка удаления", + "deletedToast": "Запись удалена", + "restoredToast": "Запись восстановлена", + "restoreError": "Не удалось восстановить", + "invalidTimestamp": "Выберите корректное время.", + "deleteConfirmTitle": "Удалить запись?", + "deleteConfirmDescription": "Эта запись настроения будет удалена. В течение короткого времени это можно отменить.", + "pageInfo": "Страница {page} из {total}", + "previousPage": "Предыдущая страница", + "nextPage": "Следующая страница", + "loginRequired": "Войдите, чтобы просматривать записи настроения.", + "note": "Заметка", + "noteCollapse": "Свернуть заметку", + "noteExpand": "Показать заметку полностью", + "notePlaceholder": "Добавьте заметку о том, как вы себя чувствуете…", + "tagPicker": "Теги", + "tagCategory": { + "feelings": "Чувства", + "sleep": "Сон", + "health": "Здоровье", + "social": "Общение", + "work": "Работа", + "hobbies": "Хобби", + "factors": "Факторы", + "custom": "Свои" + }, + "tag": { + "happy": "счастливый", + "excited": "воодушевление", + "grateful": "благодарность", + "relaxed": "расслабленность", + "content": "удовлетворённость", + "tired": "усталость", + "unsure": "неуверенность", + "bored": "скука", + "tense": "напряжённость", + "angry": "злость", + "stressed": "стресс", + "sad": "грусть", + "sleptWell": "хорошо спал", + "sleptOk": "нормально спал", + "sleptPoorly": "плохо спал", + "earlyNight": "рано лёг", + "workedOut": "тренировка", + "ateWell": "хорошо поел", + "hydrated": "достаточно воды", + "walked": "прогулка", + "alcohol": "алкоголь", + "caffeine": "кофеин", + "nicotine": "никотин", + "family": "семья", + "friends": "друзья", + "party": "вечеринка", + "alone": "один", + "productive": "продуктивность", + "overtime": "переработка", + "dayOff": "выходной", + "travel": "поездка", + "sickDay": "больничный", + "movies": "кино", + "reading": "чтение", + "gaming": "игры", + "music": "музыка", + "outdoors": "на улице", + "fastFood": "фастфуд", + "noSweets": "без сладкого", + "bigMeal": "плотная еда", + "factorWork": "работа", + "factorSocial": "общение", + "factorSleepQuality": "качество сна", + "factorStress": "стресс", + "factorConflict": "конфликт", + "factorFamily": "семья", + "factorSadness": "грусть", + "praise": "похвала" + }, + "sourceManual": "Вручную", + "sourceWeb": "Веб", + "sourceTelegram": "Telegram", + "sourceDaylio": "Daylio", + "bulkDeleteSuccess": "Удалено записей: {count}", + "bulkDeleteSuccessOne": "Запись удалена", + "bulkDeleteError": "Ошибка при удалении выбранных записей", + "bulkDeleteConfirmTitle": "Удалить записи ({count})?", + "bulkDeleteConfirmTitleOne": "Удалить эту запись?", + "bulkDeleteConfirmBody": "Выбранные записи настроения ({count}) будут удалены. В течение короткого времени это можно отменить.", + "bulkDeleteConfirmBodyOne": "Выбранная запись настроения будет удалена. В течение короткого времени это можно отменить.", + "customize": "Настроить теги настроения", + "addTagInline": "Добавить тег", + "manage": { + "groupsTitle": "Группы", + "groupsDescription": "Создайте свои группы и задайте порядок, в котором их показывает выбор.", + "newGroup": "Новая группа", + "groupLabel": "Название группы", + "groupIcon": "Значок", + "groupCreated": "Группа создана", + "groupRenamed": "Группа сохранена", + "groupDeleteTitle": "Удалить группу?", + "groupDeleteBody": "Теги из этой группы вернутся в свою исходную группу. Записи не удаляются.", + "groupDeleted": "Группа удалена", + "groupEmpty": "Своих групп пока нет.", + "groupLimitReached": "Достигнут лимит групп", + "tagsTitle": "Теги", + "tagsDescription": "Скрывайте, меняйте порядок, перемещайте и изменяйте теги, которые показывает выбор.", + "newTag": "Новый тег", + "tagLabel": "Название тега", + "tagIcon": "Значок", + "tagGroup": "Группа", + "usageCount": "Записей: {count}", + "hideTag": "Скрыть тег", + "showTag": "Показать тег", + "moveToGroup": "Переместить в группу", + "archive": "В архив", + "restore": "Восстановить", + "archivedTitle": "Архивные теги", + "archivedDescription": "Архивные теги остаются в прошлых записях. Они исчезают только из выбора.", + "archivedEmpty": "В архиве пусто.", + "purgeTitle": "Удалить тег навсегда?", + "purgeBody": "Тег будет убран из прошлых записей ({count}). Это нельзя отменить.", + "purgeAction": "Удалить навсегда", + "purged": "Тег удалён", + "tagLimitReached": "Достигнут лимит тегов", + "iconPickerTitle": "Выберите значок", + "iconSearchPlaceholder": "Поиск значков…", + "iconSearchEmpty": "Нет подходящих значков.", + "iconSearchClear": "Очистить поиск", + "orderSave": "Сохранить порядок", + "orderSaved": "Порядок сохранён", + "moveUp": "Вверх", + "moveDown": "Вниз", + "iconGroupEmotions": "Эмоции", + "iconGroupActivities": "Занятия", + "iconGroupHealth": "Здоровье", + "iconGroupFood": "Еда и напитки", + "iconGroupWeather": "Погода", + "iconGroupPlaces": "Места", + "iconGroupMisc": "Другое" + }, + "sectionMoreTags": "Ещё теги", + "sectionNoteDetails": "Заметка и подробности", + "quickTagsHelp": "Ваши частые теги, в одно касание", + "quickTagsExpand": "Ещё", + "loadError": "Не удалось загрузить записи настроения.", + "sectionLevelA": "Состояние души", + "sectionLevelAHelp": "Необязательно. Всё, что не заполните, останется пустым.", + "dimensionNotAnswered": "не записано", + "dimensionClear": "очистить", + "dimensionValueText": "{value} из {max}: от {low} до {high}", + "dimension": { + "a1": { + "label": "Настроение", + "low": "очень неприятное", + "high": "очень приятное" + }, + "a2": { + "label": "Стресс", + "low": "полностью расслаблен", + "high": "крайне напряжён" + }, + "a3": { + "label": "Энергия", + "low": "обессилен", + "high": "полон сил" + }, + "a4": { + "label": "Связанность", + "low": "изолирован", + "high": "понят и поддержан" + }, + "a5": { + "label": "Устойчивость", + "low": "полностью подавлен", + "high": "полностью способен действовать" + } + }, + "context": { + "section": { + "work": "Работа", + "contacts": "Общение", + "leisure": "Свободное время", + "events": "Событие" + }, + "field": { + "workStatus": "Рабочий день", + "workMinutes": "Отработано", + "overtimeMinutes": "Переработка", + "workLoad": "Нагрузка", + "workSatisfaction": "Удовлетворённость работой", + "contactCircles": "С кем было общение", + "contactForm": "Форма общения", + "contactExtent": "Сколько длилось", + "contactQuality": "Качество общения", + "contactSupport": "Ощущение поддержки", + "leisureCategories": "На что ушло свободное время", + "leisureMinutes": "Время для себя", + "leisureJoy": "Удовольствие", + "leisureRecovery": "Восстановление", + "eventType": "Что произошло", + "eventValence": "Как это воспринялось", + "eventAt": "Когда", + "notes": "Заметка" + }, + "workStatus": { + "off": "Не работал", + "partial": "Часть дня", + "regular": "Обычный день", + "overtime": "Дольше обычного" + }, + "contactCircles": { + "partner": "Партнёр", + "child": "Ребёнок", + "family": "Семья", + "friends": "Друзья", + "colleagues": "Коллеги", + "acquaintances": "Знакомые", + "professional": "Профессиональная поддержка", + "other": "Другие" + }, + "contactForm": { + "inPerson": "Лично", + "phone": "Телефон", + "video": "Видеозвонок", + "written": "Письменно" + }, + "contactExtent": { + "brief": "Короткое", + "medium": "Среднее", + "extended": "Долгое" + }, + "leisureCategories": { + "film": "Фильм или сериал", + "reading": "Чтение", + "gaming": "Игры", + "music": "Музыка", + "creative": "Творчество", + "outing": "Прогулка", + "garden": "Сад", + "cooking": "Готовка", + "timeWithChild": "Время с ребёнком", + "relaxation": "Отдых", + "other": "Что-то другое" + }, + "eventType": { + "goodNews": "Хорошая новость", + "badNews": "Плохая новость", + "success": "Что-то получилось", + "disappointment": "Разочарование", + "conflict": "Конфликт", + "appointment": "Встреча", + "familyEvent": "Семейное событие", + "change": "Перемена", + "unexpected": "Неожиданное" + }, + "rating": { + "workLoad": { + "low": "без давления", + "high": "под сильным давлением" + }, + "workSatisfaction": { + "low": "совсем не удовлетворён", + "high": "очень доволен" + }, + "contactQuality": { + "low": "не пошло на пользу", + "high": "очень пошло на пользу" + }, + "contactSupport": { + "low": "без поддержки", + "high": "хорошо поддержали" + }, + "leisureJoy": { + "low": "без удовольствия", + "high": "много удовольствия" + }, + "leisureRecovery": { + "low": "не восстанавливает", + "high": "очень восстанавливает" + }, + "eventValence": { + "low": "явно плохо", + "high": "явно хорошо" + } + } + }, + "dayContext": { + "minutesPlaceholder": "Минуты", + "contactsHelp": "Сколько было людей, о дне не говорит ничего. Важно то, каким было общение.", + "notePlaceholder": "Всё остальное, что относится к этому дню", + "notRecorded": "не записано", + "linkedTitle": "Из других модулей", + "linkedHelp": "Читается оттуда, где хранится. Измените там — изменится здесь.", + "linkedSleep": "Сон", + "linkedInBed": "В постели", + "linkedSteps": "Шаги", + "linkedActiveEnergy": "Активная энергия", + "linkedRestingHeartRate": "ЧСС в покое", + "linkedHrv": "Вариабельность сердечного ритма", + "bodyLogged": "Записано в дневнике болезней: симптомов {count}", + "bodyNotLogged": "В дневнике болезней за этот день ничего не записано", + "openIllness": "Открыть" + }, + "sourceNotification": "Уведомление", + "tagCatalogLoadError": "Не удалось загрузить теги." + }, + "medications": { + "title": "Лекарства", + "subtitle": "Лекарства, расписания и приём", + "loginRequired": "Войдите, чтобы управлять лекарствами.", + "addMedication": "Добавить", + "firstMedication": "Добавить первое лекарство", + "addChoice": { + "logIntake": "Записать приём", + "newMedication": "Новое лекарство" + }, + "takeAllDue": { + "button": "Принять все по сроку", + "dialogTitle": "Принять лекарства по сроку", + "dialogDescription": "Эти лекарства нужно принять сейчас. Подтвердите, чтобы записать все как принятые.", + "confirm": "Принять все ({count})", + "successToast": "Записано приёмов: {count}", + "partialToast": "Записано: {taken}, ошибок: {failed}. Попробуйте ещё раз", + "failedToast": "Приём не записан. Попробуйте ещё раз" + }, + "logIntake": { + "dialogTitle": "Записать приём", + "dialogDescription": "Запишите дозу для существующего лекарства. Можно указать прошедшие дату и время.", + "medicationLabel": "Лекарство", + "slotLabel": "Слот расписания", + "slotNone": "Без конкретного слота", + "doseLabel": "Доза", + "doseHint": "Заполнено дозой лекарства или слота. Измените, чтобы записать отклоняющуюся дозу только для этого приёма.", + "takenAtLabel": "Дата и время", + "takenAtHint": "По умолчанию сейчас; выберите более ранние дату и время, чтобы записать прошлую дозу.", + "skippedLabel": "Записано как пропущено", + "noMedications": "Сначала добавьте лекарство, затем можно записывать приёмы по нему.", + "cancel": "Отмена", + "submit": "Записать приём", + "slotError": "Не удалось сопоставить выбранный слот со временем. Выберите другой слот или «Без конкретного слота»." + }, + "emptyTitle": "Лекарств пока нет", + "emptyDescription": "Добавьте лекарства, дозы и окна напоминаний, чтобы отслеживать приверженность.", + "loadFailed": "Не удалось загрузить лекарства", + "retryLoad": "Повторить", + "inactive": "На паузе", + "intakeHistory": "История приёма", + "openDetailPage": "Открыть страницу лекарства", + "compliance": "Приверженность", + "importIntakes": "Импорт приёмов", + "importDescription": "Вставьте JSON-массив с данными приёмов. Ожидаемый формат:", + "importUploadFile": "Загрузить JSON-файл", + "importPaste": "Вставьте JSON сюда…", + "importSelected": "Выбрано: {name}", + "importFileLoaded": "Файл «{name}» загружен", + "importInvalidJson": "Файл не содержит корректный JSON", + "importNoArray": "Массив не найден", + "importFailed": "Импорт не удался", + "importInvalidFormat": "Неверный формат JSON", + "requestExample": "Пример запроса", + "categoryBloodPressure": "АД", + "categoryVitamin": "Витамины", + "categoryThyroid": "Щитовидная железа", + "categoryHormone": "Гормоны", + "categorySupplement": "БАД", + "categoryPainRelief": "Обезболивающие", + "categoryAllergy": "Аллергия", + "categoryDigestive": "Желудочно-кишечные", + "categorySkin": "Уход за кожей", + "categorySleepAid": "Снотворные", + "categoryDiabetes": "Диабет", + "categoryAntibiotic": "Антибиотики", + "categoryMentalHealth": "Психическое здоровье", + "categoryOther": "Другое", + "daysSun": "Вс", + "daysMon": "Пн", + "daysTue": "Вт", + "daysWed": "Ср", + "daysThu": "Чт", + "daysFri": "Пт", + "daysSat": "Сб", + "back": "Назад", + "today": "Сегодня", + "yesterday": "Вчера", + "tomorrow": "Завтра", + "asNeededMarker": "По потребности", + "recordOnlyBadge": "Только запись", + "courseEndedBadge": "Завершено", + "trackIntake": { + "title": "Учёт приёма", + "label": "Отслеживать приём", + "helperOn": "Дозы наступают по этому расписанию, с напоминаниями и приверженностью.", + "helperOff": "Хранится как запись: ничего не наступает, нет напоминаний, нет приверженности.", + "enabledToast": "Учёт приёма включён", + "disabledToast": "Учёт приёма выключен", + "toggleFailed": "Не удалось изменить учёт приёма." + }, + "autoMarkTaken": { + "label": "Записывать дозы автоматически", + "helper": "HealthLog записывает каждую запланированную дозу как принятую в её время. Дозу по-прежнему можно изменить или пропустить вручную. Напоминания не отправляются.", + "cardHint": "Записано автоматически", + "enabledToast": "Дозы теперь записываются автоматически", + "disabledToast": "Дозы больше не записываются автоматически", + "toggleFailed": "Не удалось изменить автоматическую запись." + }, + "withoutNotification": "Без уведомления", + "pausedSince": "На паузе с", + "takeNow": "Принять сейчас", + "lastDoseYesterday": "Последняя доза вчера", + "lastDoseDaysAgo": "Последняя доза {count} дн. назад", + "overdue": "Просрочено", + "veryOverdue": "Сильно просрочено", + "complianceWindow": "Приверженность ({days} дн.)", + "complianceUnavailable": "Не удалось загрузить приверженность", + "complianceNotApplicable": "Приверженность неприменима", + "complianceNotApplicableReason": "В HealthLog не сохранено локальное расписание.", + "complianceInfo": "Доля записанных вами ожидаемых доз. Недельные расписания считаются по неделям.", + "complianceInfoLabel": "Что значит приверженность?", + "lastIntake": "Последний приём:", + "nextIntake": "Следующий приём:", + "nextIntakeOverdue": "Просрочено с {time}, ещё можно принять", + "dayStreak": "дней подряд", + "dayStreakOne": "дней подряд", + "cycleDueToday": "Срок сегодня", + "cycleNoClosedCycles": "Закрытых циклов доз пока нет", + "taken": "Принято", + "skipped": "Пропущено", + "intakeToastTaken": "{name} записано как принятое", + "intakeToastSkipped": "{name} пропущено", + "intakeToastFailed": "Не удалось записать {name}. Попробуйте ещё раз", + "intakeUndo": "Отменить", + "intakeUndone": "Запись отменена", + "intakeUndoFailed": "Не удалось отменить. Откройте историю, чтобы исправить", + "glp1LastInjection": "{label}", + "glp1NextInjectionDays": "{label} (через {days} дн.)", + "glp1NextInjectionToday": "сегодня", + "glp1NextInjectionTomorrow": "завтра", + "glp1RotationSuggested": "Рекомендуется следующее: {site}", + "glp1LogSideEffect": "Записать побочный эффект", + "sideEffects": { + "section": "Побочные эффекты", + "addCta": "Записать", + "sheetTitle": "Записать побочный эффект", + "categoryLabel": "Категория", + "entryLabel": "Симптом", + "severityLabel": "Тяжесть", + "severity": { + "mild": "Лёгкая", + "moderate": "Умеренная", + "significant": "Значительная", + "severe": "Тяжёлая", + "verySevere": "Очень тяжёлая" + }, + "notesLabel": "Заметки (необязательно)", + "notesPlaceholder": "Всё, что стоит запомнить, не более 280 символов", + "submitCta": "Сохранить", + "cancelCta": "Отмена", + "emptyState": "Побочные эффекты пока не записаны. Отслеживание может помочь врачу и выявить закономерности со временем.", + "recentTitle": "Последние 30 дней", + "loading": "Загрузка…", + "loadMore": "Показать ещё", + "deleteCta": "Удалить", + "deleteError": "Не удалось удалить запись", + "errorSeverity": "Тяжесть должна быть от 1 до 5", + "errorEntry": "Выберите симптом", + "categories": { + "gi": "Желудочно-кишечные", + "metabolic": "Метаболические", + "injectionSite": "Место инъекции", + "cognitive": "Когнитивные", + "glp1Specific": "Специфичные для GLP-1" + }, + "entries": { + "nausea": "Тошнота", + "vomiting": "Рвота", + "diarrhea": "Диарея", + "constipation": "Запор", + "abdominalPain": "Боль в животе", + "hypoglycemiaSymptoms": "Симптомы низкой глюкозы", + "dehydration": "Обезвоживание", + "anorexia": "Снижение аппетита", + "electrolyteFatigue": "Усталость из-за нарушения электролитов", + "injectionRedness": "Покраснение в месте инъекции", + "injectionSwelling": "Отёк в месте инъекции", + "injectionBruising": "Синяк в месте инъекции", + "injectionInduration": "Уплотнение в месте инъекции", + "brainFog": "Туман в голове", + "dizziness": "Головокружение", + "lowMood": "Подавленное настроение", + "lowEnergy": "Упадок сил", + "earlySatiety": "Быстрое насыщение", + "gastroparesisLike": "Замедленное опорожнение желудка", + "dysgeusia": "Изменение вкуса", + "gallbladderDiscomfort": "Дискомфорт в желчном пузыре" + }, + "deleteConfirmTitle": "Удалить эту запись?", + "deleteConfirmBody": "Эта запись о побочном эффекте будет удалена навсегда." + }, + "scheduling": { + "naturalLanguage": { + "title": "Опишите лекарство", + "description": "Напишите о лекарстве своими словами, и мы заполним форму за вас.", + "placeholder": "напр. Мунджаро 5 мг еженедельно в среду утром, начиная со следующего понедельника", + "submit": "Извлечь", + "submitBusy": "Извлечение…", + "cancel": "Отмена", + "examples": { + "label": "Попробуйте один из примеров", + "weekly": "Мунджаро 5 мг еженедельно в среду утром", + "daily": "Ибупрофен 200 мг каждый день, 3 раза в день", + "rolling": "Метотрексат 7,5 мг каждые 7 дней от последней инъекции" + }, + "error": { + "empty": "Сначала введите описание.", + "tooLong": "Описание должно быть короче 2000 символов.", + "rateLimit": "Слишком много запросов. Подождите немного и попробуйте ещё раз.", + "noProvider": "Провайдер ИИ не настроен. Настройте его в настройках.", + "budget": "Достигнут дневной лимит ИИ. Попробуйте завтра.", + "network": "Не удалось связаться с провайдером ИИ. Повторите попытку.", + "consent": "Для чтения описания с помощью ИИ нужно ваше согласие.", + "unavailable": "Чтение описаний с помощью ИИ сейчас здесь недоступно." + } + }, + "cadence": { + "section": "Частота", + "label": "Как часто", + "kind": { + "daily": "Каждый день", + "weekdays": "Определённые дни недели", + "everyNWeeks": "Каждые N недель в определённые дни", + "monthly": "Ежемесячно в определённый день", + "everyNMonths": "Каждые N месяцев в определённый день", + "yearly": "Раз в год", + "rolling": "Каждые N дней от последнего приёма (гибко)", + "rollingExplainer": "Считается от последнего записанного приёма; приостанавливается, если пропустить дозу.", + "oneShot": "Однократная доза" + }, + "weekdays": { + "label": "Дни недели", + "short": { + "mo": "Пн", + "tu": "Вт", + "we": "Ср", + "th": "Чт", + "fr": "Пт", + "sa": "Сб", + "su": "Вс" + }, + "long": { + "mo": "Понедельник", + "tu": "Вторник", + "we": "Среда", + "th": "Четверг", + "fr": "Пятница", + "sa": "Суббота", + "su": "Воскресенье" + } + }, + "intervalWeeks": { + "suffix": "недель" + }, + "dayOfMonth": { + "label": "День" + }, + "intervalMonths": { + "suffix": "месяцев", + "dayOnLabel": "в день" + }, + "yearly": { + "date": { + "label": "Дата" + } + }, + "rollingDays": { + "suffix": "дней" + } + }, + "timesOfDay": { + "section": "Время суток", + "label": "Время суток", + "empty": { + "cta": "Добавьте первое время." + }, + "add": "Добавить время", + "remove": "Убрать", + "presets": { + "morning": "Утро", + "noon": "Полдень", + "evening": "Вечер", + "night": "Ночь" + }, + "max": { + "reached": "Достигнут максимум. Уберите время, прежде чем добавить ещё." + } + }, + "courseWindow": { + "section": "Окно курса", + "startsOn": { + "label": "Начало" + }, + "endsOn": { + "label": "Окончание" + }, + "noEndDate": "Без даты окончания", + "oneShotCaption": "(однократная доза)", + "invalidRange": "Дата окончания должна быть не раньше даты начала." + } + }, + "wizard": { + "header": { + "stepOf": "Шаг {current} из {total}", + "createTitle": "Новое лекарство", + "editTitle": "Изменить {name}" + }, + "nav": { + "back": "Назад", + "next": "Далее", + "save": "Сохранить", + "saveEdit": "Сохранить изменения", + "nextHint": "Далее: {step}", + "reviewHint": "Далее: Сохранить", + "jumpFirst": "Перейти к первому шагу", + "jumpLast": "Перейти к проверке и сохранению" + }, + "nl": { + "button": "Описать" + }, + "steps": { + "step1": { + "title": "Как называется лекарство?", + "subline": "Точно так, как на упаковке.", + "label": "Название", + "placeholder": "напр. Рамиприл", + "short": "Название" + }, + "step2": { + "title": "Что это за лекарство?", + "subline": "Используем для правильных шаблонов и аналитики.", + "short": "Тип" + }, + "step3": { + "title": "Какая доза?", + "subline": "Таблетка, доза, капля — в зависимости от формы.", + "amountLabel": "Количество", + "amountPlaceholder": "напр. 5", + "unitLabel": "Единица", + "unit": { + "mg": "мг", + "ml": "мл", + "iu": "МЕ", + "mcg": "мкг", + "g": "г", + "tablets": "таб.", + "capsules": "капс.", + "drops": "капли", + "puffs": "доза", + "sprays": "впрыск", + "pieces": "шт.", + "other": "другое" + }, + "deliveryFormLabel": "Путь введения", + "deliveryForm": { + "ORAL": "Перорально", + "INJECTION": "Инъекция", + "OTHER": "Другое" + }, + "dosesPerUnitLabel": "Доз в единице", + "dosesPerUnitPlaceholder": "напр. 4", + "dosesPerUnitHint": "Доз в ручке / флаконе. Оставьте пустым, если учёт запасов не нужен.", + "short": "Доза", + "unitsPerDoseLabel": "Единиц на дозу", + "unitsPerDoseHint": "напр. 2 таблетки по 2 мг для дозы 4 мг или ½ таблетки для разделённой дозы" + }, + "step4": { + "title": "За какой период вы его принимаете?", + "subline": "Для начала достаточно даты начала. Дату окончания можно добавить позже.", + "short": "Когда" + }, + "step5": { + "title": "Как часто вы его принимаете?", + "subline": "Выберите частоту. Подробности — на следующем шаге.", + "short": "Частота" + }, + "step6": { + "title": "Как это выглядит подробно?", + "subline": "Задайте дни недели, интервалы или день месяца.", + "intervalWeeks": { + "label": "Каждые", + "suffix": "недель" + }, + "dayOfMonth": { + "label": "В", + "suffix": "день месяца" + }, + "rollingDays": { + "label": "Каждые", + "suffix": "дней от последнего приёма" + }, + "short": "Подробности" + }, + "step7": { + "title": "Когда вы его принимаете?", + "subline": "Одно или несколько времён суток. Напоминания следуют этому списку.", + "presetsLabel": "Пресеты времени суток", + "presets": { + "morning": "Утро", + "noon": "Полдень", + "evening": "Вечер", + "night": "Ночь" + }, + "overrideHint": "Необязательно: задайте другую дозу или количество единиц только для этого времени суток. Оставьте пустым, чтобы использовать значение по умолчанию для лекарства.", + "doseOverrideLabel": "Доза для этого времени (необязательно)", + "doseOverridePlaceholder": "напр. половина таблетки", + "unitsOverrideLabel": "Единиц за это время", + "unitsOverrideInherit": "По умолчанию", + "short": "Время" + }, + "step8": { + "title": "Готово. Напоминать ли HealthLog?", + "subline": "Проверьте всё ниже перед сохранением.", + "remindersLabel": "Напоминания включены", + "remindersDescription": "Push, Telegram или ntfy — в зависимости от ваших настроек.", + "noChannelHint": "Для напоминаний нужен канал уведомлений, а сейчас ни один не активен.", + "noChannelHintLink": "Настроить уведомления", + "short": "Готово" + } + }, + "classRow": { + "bloodPressure": "АД", + "diabetes": "Диабет", + "hormone": "Гормоны", + "glp1": "Инъекция GLP-1", + "painRelief": "Боль", + "allergy": "Аллергия", + "vitamin": "Витамины", + "supplement": "БАД", + "antibiotic": "Антибиотики", + "mentalHealth": "Психическое здоровье", + "thyroid": "Щитовидная железа", + "digestive": "Желудочно-кишечные", + "skin": "Уход за кожей", + "sleepAid": "Снотворные", + "other": "Другое" + }, + "cadence": { + "daily": { + "label": "Ежедневно", + "description": "Каждый день в одно и то же время." + }, + "weekdays": { + "label": "Определённые дни недели", + "description": "Напр. понедельник, среда, пятница." + }, + "everyNWeeks": { + "label": "Каждые несколько недель", + "description": "Напр. каждые 2 недели по четвергам (GLP-1, биопрепараты)." + }, + "monthly": { + "label": "Ежемесячно", + "description": "В фиксированный день каждого месяца (напр. всегда 1-го)." + }, + "rolling": { + "label": "Гибко от последней дозы", + "description": "Следующая доза остаётся открытой. Когда вы нажмёте «Принято», счётчик начнётся заново с этого момента." + }, + "oneShot": { + "label": "Однократная доза", + "description": "Одно введение, напр. вакцина или курс антибиотика." + }, + "asNeeded": { + "label": "По потребности", + "description": "Без фиксированного плана. Записывайте приём, когда он нужен (напр. обезболивание)." + } + }, + "summary": { + "title": "Сводка", + "cadence": { + "daily": "Каждый день", + "weekdays": "В выбранные дни недели", + "biweekly": "Каждые две недели", + "monthly": "Ежемесячно", + "quarterly": "Каждые три месяца", + "yearly": "Раз в год", + "rolling": "Каждые {n} дней от последнего приёма", + "oneShot": "Однократная доза", + "asNeeded": "По потребности", + "everyNWeeks": "Каждые {n} недель", + "everyNMonths": "Каждые {n} месяцев" + }, + "weekdaysDetail": ", в {days}", + "dayOfMonthDetail": ", в день {day}.", + "times": "в {times}", + "startsOn": "Начало: {date}", + "endsOn": "Окончание: {date}", + "noEndDate": "Без даты окончания" + }, + "compose": { + "scheduleIndex": "Расписание {n} из {total}", + "list": { + "add": "Добавить ещё расписание", + "edit": "Изменить", + "remove": "Убрать", + "removeDisabled": "Нужно хотя бы одно расписание." + } + }, + "errors": { + "submitFailed": "Не удалось сохранить лекарство. Повторите попытку." + } + }, + "doseStrength": { + "title": "Сила дозы в динамике", + "axisLabel": "Записанная доза ({unit})", + "tooltipLabel": "Доза", + "currentDose": "Текущая доза: {dose} {unit}", + "noCurrentDose": "Доза пока не записана.", + "empty": "Истории титрации пока нет. Запишите изменение дозы, чтобы увидеть кривую силы." + }, + "titration": { + "title": "План титрации", + "empty": "Шаги повышения дозы пока не записаны. Добавьте датированные изменения дозы, чтобы построить план.", + "youAreHere": "Вы здесь", + "doseStep": "{dose} {unit}", + "plannedFor": "Запланировано на {date}" + }, + "injectionSiteBodyOutlineAriaLabel": "Контур тела", + "injectionSitePickerAriaLabel": "Выбор места инъекции", + "injectionSiteRecommendedAriaLabel": "{site}: рекомендуемое следующее место", + "injectionSiteLegendAriaLabel": "Легенда маркеров", + "injectionSiteLegendRecommended": "Рекомендуемое следующее место", + "injectionSiteLegendLastUsed": "Последнее использованное место", + "siteAbdomenLeft": "Живот, нижняя левая часть", + "siteAbdomenRight": "Живот, нижняя правая часть", + "siteAbdomenUpperLeft": "Живот, верхняя левая часть", + "siteAbdomenUpperRight": "Живот, верхняя правая часть", + "siteThighLeft": "Левое бедро", + "siteThighRight": "Правое бедро", + "siteUpperArmLeft": "Левое плечо", + "siteUpperArmRight": "Правое плечо", + "sideEffectTagsHelp": "Нажмите на чип, чтобы добавить его в теги записи настроения.", + "sideEffectTagNausea": "тошнота", + "sideEffectTagConstipation": "запор", + "sideEffectTagDiarrhea": "диарея", + "sideEffectTagFatigue": "усталость", + "sideEffectTagAppetiteLoss": "потеря аппетита", + "sideEffectTagHeartburn": "изжога", + "sideEffectTagHeadache": "головная боль", + "phaseConfig": "Фазы напоминаний", + "phaseConfigDescription": "Настройте время для напоминаний.", + "phaseGreen": "Зелёная", + "phaseYellow": "Жёлтая", + "phaseOrange": "Оранжевая", + "phaseRed": "Красная", + "phaseMinutes": "Мин", + "phasePercent": "%", + "phaseResetDefaults": "Сбросить к значениям по умолчанию", + "phaseSaved": "Фазы напоминаний сохранены", + "sourceWeb": "Веб", + "sourceApi": "Приложение iOS", + "sourceReminder": "Напоминание", + "sourceImport": "Импорт", + "sourceAppleHealth": "Apple Health", + "intakeSourceVia": "через {origin}", + "intakeRecordedAutomatically": "Записано автоматически", + "intakeHistoryEmptyTitle": "Приёмы пока не записаны", + "intakeHistoryEmptyDescription": "Запишите дозу на странице дневного приёма, чтобы начать историю.", + "intakeHistoryEmptyAction": "Открыть дневной приём", + "intakeHistoryColTaken": "Принято", + "intakeHistoryColScheduled": "Запланировано", + "intakeHistoryColStatus": "Статус", + "intakeHistoryColSource": "Источник", + "intakeHistoryStatusTaken": "Принято", + "intakeHistoryStatusSkipped": "Пропущено", + "intakeHistorySortByTaken": "Сортировать по времени приёма", + "intakeHistorySortByScheduled": "Сортировать по запланированному времени", + "intakeHistoryPageInfo": "Страница {page} из {total}, записей: {count}", + "intakeHistoryPrev": "Назад", + "intakeHistoryNext": "Далее", + "glp1": { + "drug": { + "tirzepatide": { + "name": "Тирзепатид" + }, + "semaglutide": { + "name": "Семаглутид" + }, + "liraglutide": { + "name": "Лираглутид" + }, + "dulaglutide": { + "name": "Дулаглутид" + }, + "exenatide": { + "name": "Эксенатид" + } + } + }, + "researchMode": { + "chart": { + "title": "Расчётный уровень лекарства", + "axisLabel": "Расчётный уровень (относительный)", + "emptyState": "Событий приёма пока нет.", + "emptyStateCta": "Запишите дозу, чтобы увидеть, как формируется расчётный уровень.", + "estimateNote": "Обучающая оценка по опубликованной EMA популяционной фармакокинетике. Не измерение.", + "unknownDrug": "{name} нет в одобренном EMA каталоге GLP-1, поэтому HealthLog не может построить для него популяционную PK-кривую." + } + }, + "detail": { + "status": { + "active": "Активно", + "paused": "На паузе", + "ended": "Завершено" + }, + "cadence": { + "oneShotOn": "Однократная доза {date}.", + "oneShotPending": "Однократная доза ожидается.", + "asNeeded": "По потребности, без фиксированного плана." + }, + "intake": { + "title": "История приёма", + "importButton": "Импорт", + "rowActions": { + "openMenu": "Открыть действия строки", + "edit": "Изменить", + "delete": "Удалить" + }, + "selection": { + "rowToggleLabel": "Выбрать строку" + }, + "bulkDelete": { + "selectionCount": "Выбрано записей: {count}", + "deleteButton": "Удалить выбранное", + "cancelButton": "Отмена", + "confirmTitle": "Удалить выбранные записи?", + "confirmBody": "Записи ({count}) будут удалены навсегда. Само лекарство останется.", + "confirmAction": "Удалить", + "toast": "Выбранное удалено", + "failed": "Не удалось удалить выбранное." + }, + "edit": { + "dialogTitle": "Изменить приём", + "takenAtLabel": "Принято в", + "scheduledForHint": "Запланировано: {dateTime}", + "farFromScheduledWarning": "Это далеко от запланированного времени. Проверьте дату.", + "skippedLabel": "Пропущено", + "save": "Сохранить", + "cancel": "Отмена", + "savedToast": "Приём обновлён", + "failed": "Не удалось обновить приём." + }, + "deleteRow": { + "confirmTitle": "Удалить этот приём?", + "confirmBody": "Запись будет удалена навсегда.", + "confirmAction": "Удалить", + "toast": "Приём удалён", + "failed": "Не удалось удалить приём." + }, + "viewRecent90": "Последние 90 дней", + "viewAll": "Вся история", + "viewToggleLabel": "Диапазон истории" + }, + "verlauf": { + "loading": "Загрузка истории…", + "loadError": "Не удалось загрузить историю.", + "empty": "В этом периоде приёмов пока нет.", + "summaryEmpty": "Пока нет доз для оценки.", + "adherenceLabel": "Приверженность", + "adherenceBarLabel": "{onTime} вовремя, {late} с опозданием, {missed} пропущено", + "add": "Запись", + "markTaken": "Принято", + "markSkipped": "Пропущено", + "rowActionsLabel": "Действия для {time}", + "markAsTaken": "Отметить как принято", + "markAsSkipped": "Отметить как пропущено", + "adHocTag": "вне расписания", + "takenDetail": "запланировано {planned}, принято {taken}", + "doseTaken": "Доза: {dose}", + "status": { + "taken_on_time": "вовремя", + "taken_late": "с опозданием", + "skipped": "пропущено", + "missed": "пропущено", + "upcoming": "предстоит", + "ad_hoc": "вне расписания" + }, + "addDialog": { + "title": "Добавить приём", + "description": "Запишите дозу, в том числе задним числом или вне расписания.", + "takenAtLabel": "Принято в", + "skippedLabel": "Пропущено", + "nudgeHint": "Близко к слоту {slot}. При сохранении спросим, отнести ли приём к нему.", + "cancel": "Отмена", + "submit": "Сохранить" + }, + "nudge": { + "title": "Отнести к этому слоту?", + "body": "Этот приём чуть выходит за окно слота {slot}. Отнести его к этому слоту или оставить как запись вне расписания?", + "keepAdHoc": "Вне расписания", + "pin": "Отнести" + }, + "pin": { + "action": "Отнести к слоту {time}", + "release": "Снять привязку", + "pinnedTag": "отнесено", + "pinnedToast": "Приём отнесён к слоту", + "unpinnedToast": "Привязка снята", + "dueContext": "срок был: {time} ({delta})", + "confirmTitle": "Отнести к слоту {time}?", + "confirmBody": "Приём засчитывается для этого слота так же, как если бы был записан там: вовремя или с опозданием в зависимости от времени приёма, поэтому показатель не завышается. Привязку можно снять в любой момент.", + "confirmCancel": "Отмена", + "confirmAction": "Отнести" + } + }, + "notifications": { + "title": "Уведомления", + "switchLabel": "Отправлять напоминание, когда наступает эта доза", + "helperOn": "Напоминания включены.", + "helperOff": "Напоминания выключены.", + "enabledToast": "Напоминания включены", + "disabledToast": "Напоминания выключены", + "toggleFailed": "Не удалось изменить настройку напоминаний.", + "clientManagedChip": "Управляется iPhone", + "clientManagedHint": "Напоминания для этого лекарства управляются вашим iPhone." + }, + "settings": { + "title": "Настройки", + "phases": { + "openButton": "Настроить фазы", + "requiresCourseWindow": "Фазы доступны после задания окна курса." + }, + "grace": { + "label": "Окно напоминания", + "appliesToAllNote": "Применяется ко всем расписаниям этого лекарства.", + "unit": "минут", + "saved": "Окно напоминания сохранено", + "failed": "Не удалось сохранить окно напоминания." + }, + "codes": { + "label": "Клинические коды (ATC / RxNorm)", + "note": "Необязательно. Используется в экспорте медицинской карты FHIR. Коды берутся точно как введены, без догадок.", + "atcLabel": "ATC", + "rxNormLabel": "RxNorm", + "saved": "Клинические коды сохранены", + "failed": "Не удалось сохранить клинические коды." + } + }, + "zone": { + "title": "Управление и опасная зона", + "pause": { + "title": "Пауза", + "helper": "Приостановите напоминания, пока не включите их снова. История сохраняется.", + "pausedToast": "Напоминания приостановлены", + "resumedToast": "Напоминания возобновлены", + "failed": "Не удалось изменить состояние паузы." + }, + "end": { + "title": "Завершить лекарство", + "helper": "Остановите напоминания и отметьте лекарство как завершённое. История остаётся видимой.", + "button": "Завершить", + "dialogTitle": "Завершить {name}? Напоминания прекратятся, история останется видимой", + "dialogBody": "Больше напоминаний не будет. Старые записи остаются в хронологии.", + "toast": "Лекарство завершено", + "failed": "Не удалось завершить лекарство." + }, + "purge": { + "title": "Удалить историю", + "helper": "Для этого лекарства сохранено событий приёма: {count}.", + "button": "Удалить историю", + "dialogTitle": "Действительно удалить историю?", + "dialogBody": "События приёма ({count}) будут удалены навсегда. Само лекарство останется.", + "toast": "История удалена", + "failed": "Не удалось удалить историю." + }, + "delete": { + "title": "Удалить лекарство", + "helper": "Удаляет лекарство и все связанные записи.", + "button": "Удалить", + "dialogTitle": "Удалить {name}?", + "dialogBody": "Лекарство, его расписания, история приёма, токены API, конфигурация фаз и напоминания будут удалены навсегда.", + "toast": "Лекарство удалено", + "failed": "Не удалось удалить лекарство." + } + }, + "phases": { + "modeLabel": "Режим {phase}", + "saveFailed": "Не удалось сохранить фазы напоминаний." + }, + "api": { + "caption": "Эндпоинт для «{name}»", + "copyUrl": "Копировать URL", + "urlCopied": "URL скопирован", + "mintToken": "Создать токен", + "mintAnotherToken": "Создать ещё токен", + "mintFailed": "Не удалось создать токен.", + "copyFailed": "Не удалось скопировать.", + "tokenCopied": "Токен скопирован", + "copyToken": "Копировать токен", + "mintedHint": "Скопируйте этот токен сейчас. Он показывается только один раз." + }, + "advanced": { + "dataPortability": { + "import": { + "title": "Импорт приёмов", + "helper": "Загрузите прошлые приёмы из JSON-файла или вставленного JSON.", + "button": "Импорт JSON" + }, + "export": { + "title": "Экспорт лекарства", + "helper": "Скачайте это лекарство как CSV-файл.", + "includeIntake": "Включить историю приёма", + "button": "Экспорт CSV" + } + } + }, + "header": { + "historyLabel": "Открыть историю приёма" + }, + "history": { + "plannedSuffix": "запланировано" + }, + "tabs": { + "uebersicht": "Обзор", + "zeitplan": "Расписание", + "bestand": "Запас", + "verlauf": "История", + "injektion": "Инъекция", + "erweitert": "Дополнительно", + "wirkung": "Эффект" + }, + "shell": { + "loadFailed": "Не удалось загрузить это лекарство.", + "tablistLabel": "Разделы лекарства" + }, + "uebersicht": { + "statusTitle": "Статус", + "nextDoseLabel": "Следующая доза", + "nextDoseNone": "Предстоящих доз нет.", + "nextDoseAsNeeded": "По потребности, запланированной дозы нет.", + "nextDoseNotTracked": "Не отслеживается, хранится как запись.", + "pausedHint": "На паузе: без напоминаний.", + "reminderLabel": "Напоминание", + "reminderOn": "Вкл.", + "reminderOff": "Выкл.", + "supplyLabel": "Запас", + "supplyRunway": "Хватит примерно ещё на {days} дн.", + "jumpToZeitplan": "Открыть расписание", + "jumpToVerlauf": "Открыть историю", + "jumpToBestand": "Открыть запас", + "complianceTitle": "Приверженность", + "complianceEmpty": "Данных о приверженности пока нет." + }, + "bestand": { + "title": "Запас", + "summary": "Осталось доз: {remaining} из {total}", + "itemsTitle": "Упаковки и ёмкости", + "doses": "Доз: {remaining} / {total}", + "unknown": "Неизвестно", + "state": { + "ACTIVE": "Не открыто", + "IN_USE": "Используется", + "EXPIRED": "Просрочено", + "USED_UP": "Израсходовано" + }, + "empty": "Запас не записан.", + "emptyHelper": "Зарегистрируйте упаковку или ёмкость, чтобы отслеживать остаток запаса и его хватит на сколько.", + "emptyCta": "Зарегистрировать упаковку", + "addButton": "Зарегистрировать", + "lowStockLinkOn": "Уведомление о низком запасе: меньше {days} дн.", + "lowStockLinkOff": "Уведомление о низком запасе: выкл.", + "addTitle": "Зарегистрировать упаковку или ёмкость", + "addDescription": "Запишите новый запас с количеством единиц; срок годности необязателен.", + "addQuantityLabel": "Количество (единиц)", + "addQuantityHelper": "От 1 до 1000 единиц на упаковку или ёмкость.", + "addExpiryLabel": "Срок годности (необязательно)", + "addSubmit": "Зарегистрировать", + "addSuccess": "Запас зарегистрирован", + "addFailed": "Не удалось зарегистрировать запас.", + "adjustButton": "Скорректировать", + "adjustTitle": "Исправить ёмкость", + "adjustDescription": "Задайте оставшиеся единицы и исправьте даты, напечатанные на этой ёмкости или записанные для неё. 0 единиц отмечает её как израсходованную.", + "adjustQuantityLabel": "Оставшиеся единицы", + "adjustHelper": "Ёмкость: {total} единиц.", + "adjustSubmit": "Сохранить", + "adjustSuccess": "Запас обновлён", + "adjustFailed": "Не удалось обновить запас.", + "deleteTitle": "Удалить ёмкость?", + "deleteDescription": "Навсегда удаляет эту упаковку или ёмкость из запаса. Записанные приёмы остаются без изменений.", + "deleteSuccess": "Запись запаса удалена", + "deleteFailed": "Не удалось удалить запись запаса.", + "containerTypeLabel": "Тип ёмкости", + "containerType": { + "PEN": "Ручка", + "AMPOULE": "Ампула", + "BLISTER": "Упаковка таблеток", + "INHALER": "Ингалятор", + "BOTTLE": "Флакон", + "OTHER": "Другое" + }, + "unitsDetail": "Единиц: {remaining} / {total}", + "quantityModeDoses": "Дозы", + "quantityModeUnits": "Единицы", + "quantityInUnits": "= {units} единиц", + "quantityInDoses": "≈ {doses} доз", + "quantityUnderOneDose": "< 1 дозы", + "expiredSuffix": "+ {units} единиц просрочено", + "packagingTitle": "Упаковка и доза", + "packagingUnitsPerDose": "1 доза = {units} единиц", + "packagingDefaultPack": "Размер упаковки по умолчанию: {units} единиц", + "packagingNoDefaultPack": "Размер упаковки по умолчанию не задан", + "packagingEdit": "Изменить", + "packagingDescription": "Укажите, сколько единиц расходуется на одну дозу и какого размера обычно бывает новая упаковка, например после смены производителя с другим размером блистера.", + "packagingUnitsPerDoseLabel": "Единиц на дозу", + "packagingUnitsPerDoseHelper": "Например, две таблетки по 2 мг для дозы 4 мг или 1,5 для полутора таблеток (больше 0, до 100). Уже записанные дозы остаются без изменений.", + "packagingDefaultPackLabel": "Размер упаковки по умолчанию (единицы)", + "packagingDefaultPackHelper": "Подставляет количество при регистрации новых упаковок (1–1000). Оставьте пустым, если не применимо.", + "packagingSuccess": "Данные упаковки сохранены", + "packagingFailed": "Не удалось сохранить", + "addManufacturerLabel": "Производитель", + "addDoseStrengthLabel": "Концентрация", + "addDoseStrengthHint": "Как указано на упаковке, например 5 мг/0,5 мл.", + "openedOn": "Открыто {date}", + "expiresOn": "Срок до {date}", + "summaryAllExpired": "Нет пригодного запаса: {units} единиц просрочено", + "editExpiryLabel": "Срок годности с упаковки", + "editExpiryHelper": "Дата, напечатанная на коробке. Оставьте пустым, если она не записана.", + "editOpenedLabel": "Открыто", + "editOpenedHelper": "Оставьте пустым, если упаковка ещё запечатана.", + "editOpenedHelperClock": "Ручка или ампула годна 30 дней после вскрытия. Оставьте пустым, если она ещё запечатана." + }, + "erweitert": { + "group": { + "lifecycle": "Жизненный цикл", + "externalApi": "Внешний API", + "data": "Данные", + "danger": "Опасная зона" + }, + "editor": { + "title": "Изменить лекарство в редакторе", + "helper": "Измените название, класс лечения, частоту и расписания в пошаговом редакторе.", + "button": "Открыть редактор" + } + }, + "zeitplan": { + "title": "Расписание", + "timesTitle": "Время приёма", + "timesNote": "Настройте время каждой дозы и окно своевременности. Частота (ежедневно, еженедельно…) задаётся в редакторе в разделе «Дополнительно».", + "scheduleLabel": "Расписание {index}", + "fullEditNote": "Частота, класс лечения и период курса задаются в редакторе в разделе «Дополнительно» → «Жизненный цикл».", + "graceEcho": "Окно напоминания: {minutes} мин", + "reminderTitle": "Напоминание", + "manageChannels": "Управление каналами уведомлений", + "history": { + "title": "История плана", + "currentSince": "Текущий план с {date}", + "noTimes": "Без фиксированного времени", + "manualChip": "Добавлено вручную", + "showErasOne": "Показать 1 прошлый период", + "showErasOther": "Показать прошлые периоды ({count})", + "hideEras": "Скрыть прошлые периоды", + "addEra": "Добавить прошлый период", + "addEraTitle": "Добавить прошлый период", + "addEraDescription": "Запишите время, в которое это лекарство принималось раньше, например до того, как вы изменили его здесь.", + "editAria": "Изменить период", + "editEraTitle": "Изменить период", + "editEraDescription": "Настройте время приёма и диапазон дат этого периода.", + "archivedEditHint": "Этот период был записан автоматически. Ваше изменение исправляет записанную историю; оригинал хранится внутри как запись.", + "updatedToast": "Период обновлён", + "updateError": "Не удалось обновить период. Он не должен пересекаться с другими периодами и должен заканчиваться до текущего плана.", + "timesLabel": "Время приёма", + "fromLabel": "С", + "untilLabel": "До", + "untilHint": "«До» — это день, когда вступил в силу следующий план (не включая его).", + "validationTimes": "Добавьте хотя бы одно время.", + "validationRangeMissing": "Укажите обе даты: с и до.", + "validationRangeOrder": "Дата «с» должна быть раньше даты «до».", + "cancel": "Отмена", + "submit": "Сохранить период", + "createdToast": "Прошлый период сохранён", + "createError": "Не удалось сохранить период. Он не должен пересекаться с существующими периодами и должен заканчиваться до текущего плана.", + "deletedToast": "Период удалён", + "deleteError": "Не удалось удалить период", + "deleteAria": "Удалить период", + "deleteConfirmTitle": "Удалить период?", + "deleteConfirmBody": "История и приверженность за этот период снова будут рассчитываться по текущему плану.", + "deleteConfirmAction": "Удалить", + "loadError": "Не удалось загрузить историю плана" + }, + "save": "Сохранить расписание", + "saved": "Расписание сохранено", + "failed": "Не удалось сохранить расписание", + "window": { + "intro": "Для каждой дозы укажите, когда приём ещё считается своевременным: точное время (±1 ч) или своё окно, например 07:00–09:00.", + "explicitToggle": "Своё окно", + "startLabel": "Начало окна", + "endLabel": "Конец окна", + "onTimeBand": "Своевременно: {start}–{end}", + "lateUntil": "с опозданием до {time}", + "lateDays": "с опозданием до {days} дней после", + "orderError": "Начало должно быть раньше конца.", + "noTimes": "Время приёма ещё не задано." + } + } + }, + "logInjectionSiteTitle": "Записать место инъекции", + "logInjectionSiteDescription": "Куда вы ввели {name}? Необязательно: можно пропустить.", + "logInjectionSiteSkip": "Пропустить", + "logInjectionSiteConfirm": "Сохранить место", + "logInjectionSiteNoneAvailable": "Нет доступного места инъекции. Все места исключены в ваших настройках.", + "logInjectionSiteSaveFailed": "Не удалось сохранить место инъекции. Попробуйте ещё раз.", + "perSlotUnits": "{units} на дозу", + "trackInjectionSitesToggle": "Отслеживать места инъекций", + "trackInjectionSitesHint": "После приёма дозы спрашивать, какое место использовано, и предлагать следующее по ротации.", + "allowedSitesLabel": "Разрешённые места", + "allowedSitesHint": "Оставьте все выбранными, чтобы не ограничивать. Места, исключённые глобально, никогда не предлагаются.", + "viewToggleLabel": "Вид", + "viewToggleHint": "Выберите, показывать лекарства карточками или таблицей.", + "viewCards": "Карточки", + "viewTable": "Таблица", + "viewSaveFailed": "Не удалось сохранить вид", + "tableCaption": "Лекарства в виде таблицы со статусом, следующей дозой, приверженностью и запасом", + "tableColName": "Название", + "tableColStatus": "Статус", + "tableColNextDose": "Следующая доза", + "tableColCompliance": "Приверженность", + "tableColStock": "Запас", + "tableColActions": "Действия", + "tableSortBy": "Сортировать по {column}", + "tableComplianceDays": "{days} дн.", + "tableStockDoseOne": "1 доза", + "tableStockDoses": "{count} доз", + "tableStockRunway": "≈ {days} дн. осталось", + "cardLowStockRunway": "Запас: ≈ {days} дн.", + "takeActionFor": "Принять {name}", + "skipActionFor": "Пропустить {name}", + "reorderDescription": "Задайте порядок лекарств для карточек и таблицы.", + "reorderSaved": "Порядок сохранён", + "reorderSaveFailed": "Не удалось сохранить порядок", + "customize": "Настроить лекарства", + "efficacy": { + "title": "Эффект", + "intro": "Как изменились показатели, на которые должно влиять это лекарство, вокруг даты начала приёма. Показывает, что совпадает по времени (связь, а не причина), и никогда не даёт советов о лечении или дозе.", + "notEligible": "Нет показателя, с которым можно связать это лекарство.", + "startFallback": "Дата начала не задана, поэтому для сравнения используется ваше первое записанное измерение.", + "noStart": "Задайте дату начала приёма этого лекарства, чтобы сравнить измерения до и после него.", + "disclaimer": "Только связь: эти цифры показывают, что изменилось за тот же период, а не то, что изменение вызвало лекарство. Любое решение о лечении обсуждайте с врачом.", + "primaryBadge": "Основная цель", + "noSeries": "Для этой цели ещё нет записанных измерений.", + "startMarker": "Начало", + "adherenceLane": "Приверженность", + "typicalRange": "Обычный диапазон", + "levelShift": "Около {date} обнаружен сдвиг уровня.", + "plateau": { + "title": "Плато веса на текущей дозе", + "evidence": "Вес изменился на {delta} {unit} за последние {window} дней ({readings} измерений), {days} дней на дозе {dose}." + }, + "retarget": { + "label": "Не тот показатель?", + "placeholder": "Отслеживать по…", + "apply": "Применить", + "reset": "Сбросить по умолчанию", + "error": "Не удалось сохранить изменение. Попробуйте ещё раз." + }, + "beforeAfter": { + "summary": "Ø {before} до → Ø {after} после, изменение {delta}.", + "counts": "На основе {beforeCount} измерений до и {afterCount} после.", + "needBefore": "Пока недостаточно измерений до начала. Для сравнения нужно около {weeks} недель до и после.", + "needAfter": "Пока недостаточно измерений после начала. Для сравнения нужно около {weeks} недель до и после.", + "needStart": "Задайте дату начала, чтобы сравнить измерения до и после него.", + "needData": "Пока недостаточно измерений. Для сравнения нужно около {weeks} недель до и после начала." + }, + "insights": { + "title": "Эффект лекарства", + "subtitle": "Что совпадает с показателями, на которые нацелены ваши лекарства: только связь, никогда не вердикт.", + "link": "Открыть вид эффекта", + "empty": "Пока недостаточно данных, чтобы связать ваши лекарства с целевыми показателями." + }, + "scaleAbsolute": "Абсолютная", + "scalePercentSinceStart": "% с начала", + "scaleToggleLabel": "Шкала графика", + "segmented": { + "title": "Изменение в начале", + "level": "Прямо в начале уровень изменился на {value} {unit} (95 % диапазон {low} до {high}).", + "slope": "После начала недельная динамика изменилась на {value} {unit} в неделю (95 % диапазон {low} до {high}).", + "preSlope": "До начала динамика составляла {value} {unit} в неделю.", + "includesZero": "Если диапазон включает ноль, эти измерения также согласуются с отсутствием изменений.", + "basis": "На основе {before} дней до и {after} дней после начала ({from} до {to}).", + "excludedAdherence": "{count} дней после начала исключены, так как было принято менее {floor} % доз за {lookback} дней до них.", + "excludedNotTaking": "{count} дней исключены, так как лекарство было на паузе или между курсами.", + "notTracked": "Приём этого лекарства не отслеживается, поэтому дни за пропущенные дозы не исключались.", + "endDoseChange": "Окно заканчивается до первого изменения дозы, поэтому это описывает начальную дозу.", + "confoundersTitle": "Другие изменения лекарств в этом окне, которые этот вид не может отделить от данного:", + "confounderStarted": "{name} начат {date}", + "confounderStopped": "{name} прекращён {date}", + "confounderDoseChange": "{name}: доза изменена {date}", + "confounderPaused": "{name} на паузе с {date}", + "confounderResumed": "{name} возобновлён {date}", + "method": "Как это рассчитывается: одна линия подгоняется к дневным значениям до начала, другая — после. Скачок между ними в начале — это изменение уровня, разница их наклонов — изменение динамики. Диапазоны учитывают измерения, которые переносятся с одного дня на следующий.", + "needStart": "Задайте дату начала, чтобы увидеть изменение в начале.", + "needBefore": "Для изменения в начале нужны измерения минимум в {days} дней, распределённых по {span} дням до начала.", + "needAfter": "Для изменения в начале нужны измерения минимум в {days} дней, распределённых по {span} дням после начала, в дни приёма доз.", + "fitFailed": "Не удалось подогнать эти измерения, поэтому изменение в начале не показано.", + "autocorrelation": "Дневные значения сильно переносятся с одного дня на следующий, поэтому даже эти диапазоны могут быть слишком узкими." + } + }, + "import": { + "resultSuccess": "Импортировано приёмов: {imported}", + "resultPartial": "Импортировано {imported}, пропущено {skipped}.", + "resultNothing": "Ничего не импортировано: все записи пропущены ({skipped}).", + "resultAlreadyRecorded": "{recorded} приёмов уже записано. Нового не добавлено.", + "resultEmpty": "В этом файле не было приёмов.", + "showSkipDetails": "Показать пропущенные строки ({count})", + "skipDetailLine": "Строка {line}: {reason}", + "skipDetailsOmitted": "Ещё {count} пропущенных строк не показаны.", + "skipGroupOne": "Пропущена {count} запись: {reason}", + "skipGroupFew": "Пропущено {count} записи: {reason}", + "skipGroupOther": "Пропущено {count} записей: {reason}", + "reasonDuplicateInFile": "другая запись в том же файле имеет те же дату и время", + "reasonAlreadyRecorded": "приём уже записан на эти дату и время", + "reasonUnknown": "причина не записана", + "reasonMedicationNotFound": "ни одно лекарство в записях не совпадает с названием в файле", + "reasonMedicationAmbiguous": "название в файле совпадает с несколькими лекарствами в записях", + "reasonMedicationIsMirrored": "лекарство — копия списка другого приложения только для чтения", + "reasonStatusUnknown": "статус в файле не определён форматом", + "reasonMissingTimestamp": "в строке не указано время", + "reasonMissingOffset": "у времени нет смещения UTC, поэтому момент неизвестен", + "reasonUnreadableTimestamp": "время не в формате, описанном в экспорте", + "reasonImplausibleTimestamp": "время не соответствует реальному моменту или лежит в будущем", + "reasonMissingMedication": "в строке не указано лекарство", + "reasonUnreadableDosage": "дозировка не является числом", + "reasonUnreadableRow": "в строке меньше столбцов, чем в заголовке", + "reasonStatusNoDoseInformation": "файл ничего не сообщает об этой дозе; никто не ответил и ничего не записано", + "reasonStatusReminderEvent": "строка относится к отложенному напоминанию, что ничего не говорит о дозе", + "reasonStatusNotificationNotSent": "строка сообщает, что уведомление не отправлено, что относится к приложению, а не к дозе" + }, + "unitsPerDoseField": { + "other": "Другое…", + "inputLabel": "Единиц на дозу, другое значение", + "placeholder": "например 1,5 или 1 1/2", + "invalid": "Введите число больше 0 и до 100, например 1,5 или 1 1/2.", + "preview": "Считается как {value} на дозу" + }, + "category": { + "custom": { + "add": "Новая категория", + "label": "Название категории", + "labelPlaceholder": "например Дорожная аптечка", + "create": "Добавить", + "limitReached": "Вы достигли предела в 20 собственных категорий.", + "saveFailed": "Не сохранилось. Попробуйте ещё раз.", + "bpGateNote": "Аналитика АД учитывает только лекарства из встроенной категории «АД».", + "manage": "Управление категориями", + "manageDescription": "Ваши собственные категории рядом со встроенными.", + "hidden": "Скрыто", + "count": "Лекарств: {count}", + "rename": "Переименовать", + "hide": "Скрыть из выбора", + "show": "Показать в выборе", + "delete": "Удалить", + "deleteTitle": "Удалить эту категорию?", + "deleteBody": "{count} лекарств из неё перейдут в «Другое». Сами лекарства останутся.", + "movedToOther": "Категория удалена. {count} лекарств переведено в «Другое»." + }, + "filter": { + "label": "Категория", + "all": "Все категории" + } + }, + "course": { + "endedOn": "Последний курс завершён {date}", + "nth": "Курс {n}", + "startNew": "Начать новый курс", + "editTitle": "Изменить курс", + "startsOn": "Первый день", + "endsOn": "Последний день (необязательно)", + "note": "Заметка (необязательно)", + "notePlaceholder": "например грипп в марте", + "title": "Курсы", + "helper": "Когда вы его принимали. Дозы ожидаются только внутри курса.", + "none": "Принимается непрерывно, без отдельных курсов.", + "range": "с {start} по {end}", + "since": "С {start}", + "meta": "Курс {n}, {status}, принято доз: {taken}", + "status": { + "current": "идёт", + "upcoming": "предстоит", + "ended": "завершён" + }, + "delete": "Удалить курс", + "deleteTitle": "Удалить этот курс?", + "deleteBody": "Даты удалятся; записанные дозы останутся в истории.", + "deleteLastConfirm": "Это единственный курс. Без него лекарство считается принимаемым непрерывно с момента добавления. Записанные дозы останутся.", + "error": { + "overlap": "Этот курс пересекается по дням с другим.", + "currentOpen": "Завершите текущий курс, прежде чем добавлять следующий.", + "oneShot": "У однократного лекарства только один курс.", + "invalidRange": "Последний день не может быть раньше первого.", + "generic": "Не сохранилось. Попробуйте ещё раз." + } + }, + "composition": { + "title": "Состав", + "empty": "Добавьте, что содержит одна таблетка или капсула, чтобы учитывать каждый принятый приём в микронутриентах.", + "perUnitNote": "На таблетку или капсулу; каждый принятый приём добавляет это к дневным микронутриентам.", + "add": "Добавить", + "edit": "Изменить", + "rowHelper": "Что содержит одна таблетка или капсула, для её микронутриентов.", + "sheetTitle": "Что содержит одна единица", + "sheetDescription": "Введите количества на таблетку или капсулу, как указано на этикетке.", + "nutrientLabel": "Нутриент", + "amountLabel": "Количество", + "unitLabel": "Единица", + "choose": "Выберите нутриент", + "addRow": "Добавить нутриент", + "removeRow": "Убрать {name}", + "editorEmpty": "Нутриентов пока нет. Добавьте по одному на строку этикетки.", + "labelPhoto": "Считать с фото этикетки", + "labelReading": "Чтение этикетки…", + "labelWaiting": "Ждём, когда фоновый обработчик возьмёт это в работу.", + "labelReviewNote": "Проверьте каждую строку по этикетке перед сохранением.", + "lowConfidence": "Эту строку было трудно прочитать; сверьте её с этикеткой.", + "unmatchedTitle": "Строки без подходящего нутриента, при необходимости введите вручную:", + "servingNote": "На этикетке указано: {note}. Количества показаны на одну единицу.", + "labelError": "Не удалось прочитать этикетку", + "saveError": "Не удалось сохранить состав", + "catalogError": "Не удалось загрузить список нутриентов", + "invalidRow": "Выберите нутриент и укажите количество больше нуля в каждой строке." + } + }, + "charts": { + "loadingLabel": "Загрузка графика…", + "loadingSlowHint": "Вычисление аналитики. Это может занять момент.", + "weight": "Вес", + "bloodPressure": "АД", + "pulse": "Пульс", + "bodyFat": "Жировая масса", + "sleep": "Сон", + "steps": "Шаги", + "hrv": "Вариабельность сердечного ритма", + "restingHeartRate": "ЧСС в покое", + "activeEnergy": "Активная энергия", + "flights": "Этажи", + "distance": "Расстояние ходьбы и бега", + "vo2Max": "VO₂ max", + "bodyTemperature": "Температура тела", + "noData": "Нет данных за выбранный период", + "bucketWeekly": "Среднее за неделю", + "bucketMonthly": "Среднее за месяц", + "bucketWeeklyDaily": "Среднее за день по неделям", + "bucketMonthlyDaily": "Среднее за день по месяцам", + "days7Label": "7 дн.", + "days7Title": "Последние 7 дней", + "days30Label": "30 дн.", + "daysNLabel": "{days} дн.", + "days30Title": "Последние 30 дней", + "days90Label": "90 дн.", + "days90Title": "Последние 90 дней", + "daysAllLabel": "Все", + "daysAllTitle": "За всё время", + "systolic": "Систолическое", + "diastolic": "Диастолическое", + "bodyWater": "Вода в организме", + "boneMass": "Костная масса", + "spo2": "SpO₂", + "movingAverage7d": "Динамика за 7 дней", + "avg7dShort": "7 дн.", + "avg30dShort": "30 дн.", + "trend7dShort": "Динамика за 7 дней", + "trend": "Динамика", + "perWeek": "/нед.", + "totalDelta": "Всего", + "colorGreen": "Зелёный:", + "colorOrange": "Оранжевый:", + "colorRed": "Красный:", + "mood": "Настроение", + "moodScore": "Балл настроения", + "weekdays": { + "mon": "Пн", + "wed": "Ср", + "fri": "Пт", + "sun": "Вс" + }, + "months": { + "jan": "Янв", + "feb": "Фев", + "mar": "Мар", + "apr": "Апр", + "may": "Май", + "jun": "Июн", + "jul": "Июл", + "aug": "Авг", + "sep": "Сен", + "oct": "Окт", + "nov": "Ноя", + "dec": "Дек" + }, + "heatmapOnTime": "вовремя", + "heatmapLate": "с опозданием", + "heatmapVeryLate": "с большим опозданием", + "legendOnTime": "Вовремя", + "legendLate": "С опозданием", + "legendVeryLate": "С большим опозданием", + "legendMissed": "Пропущено", + "emptyStateTitle": "Добавьте больше измерений, чтобы увидеть динамику", + "emptyStateDescription": "Запишите хотя бы 3 записи, чтобы открыть линию динамики.", + "needMoreDistinctDaysTitle": "Нужно больше разных дней", + "needMoreDistinctDaysDescription": "Записывайте в большее число дней, чтобы открыть линию динамики.", + "noDataInRangeTitle": "Нет данных в этом диапазоне", + "noDataInRangeDescription": "В выбранном диапазоне нет измерений. Смените диапазон или запишите новое измерение.", + "errorTitle": "Не удалось загрузить данные", + "loadErrorTitle": "Не удалось загрузить график", + "loadErrorReload": "Обновить", + "sparseDataCaption": "Больше дней дополнит динамику.", + "tooltipHourlyMean": "{metric} (среднее по часам)", + "dataTable": { + "toggle": "Точки данных ({count})", + "columnDate": "Дата", + "noValue": "Нет значения", + "captionDay": "Одна строка на день {metric}, те же точки, что рисует график.", + "captionWeek": "Одна строка на неделю {metric}, среднее за дни этой недели, те же точки, что рисует график.", + "captionMonth": "Одна строка на месяц {metric}, среднее за дни этого месяца, те же точки, что рисует график.", + "hourlyMeanNote": "{metric} — это среднее за каждый день, где каждый час считается один раз, поэтому тренировка не перевешивает остаток дня." + }, + "personalBaseline": "Ваша норма", + "deltaVsBaseline": "{delta} к вашей норме", + "deltaUnchanged": "соответствует вашей норме", + "deltaVsTarget": "{delta} к цели", + "weekdaysFull": { + "mon": "Понедельник", + "tue": "Вторник", + "wed": "Среда", + "thu": "Четверг", + "fri": "Пятница", + "sat": "Суббота", + "sun": "Воскресенье" + }, + "rangeBand": "Диапазон", + "a11y": { + "summary": "График {metric}. Диапазон {min} до {max}, последнее {latest}, динамика {trend}.", + "noData": "График {metric}. Данных нет.", + "trendUp": "рост", + "trendDown": "снижение", + "trendFlat": "стабильно", + "scatterSummary": "График корреляции, {count} точек: {xLabel} против {yLabel}.", + "scatterNoData": "График корреляции {xLabel} против {yLabel}. Данных нет.", + "moodHeatmap": "Тепловая карта настроения с {start} по {end}, записано дней: {days}.", + "moodHeatmapEmpty": "Тепловая карта настроения, дней пока не записано.", + "complianceHeatmap": "Тепловая карта приверженности лекарствам с {start} по {end}, активных дней: {days}.", + "complianceHeatmapEmpty": "Тепловая карта приверженности лекарствам, активных дней пока нет." + }, + "medicationsEmptyAction": "Добавить лекарство", + "rangeLabel": "Период" + }, + "chart": { + "overlay": { + "controls": { + "title": "Наложения на график", + "trendIndicator": "Динамика за 7 дней", + "trendArrow": "Стрелка динамики", + "targetRange": "Целевой диапазон", + "comparisonBaseline": "Сравнение", + "comparisonUnavailable": "Данных за прошлый период пока нет", + "tooltip": { + "openSettings": "Настройки наложений на график" + } + } + } + }, + "comparison": { + "baseline": { + "none": "Нет", + "lastMonth": "Прошлый месяц", + "lastYear": "Прошлый год" + }, + "captionLastMonth": "к прошлому месяцу", + "captionLastYear": "к прошлому году", + "deltaVs": { + "lastMonth": "{delta} к прошлому месяцу", + "lastYear": "{delta} к прошлому году" + }, + "tooltipPrior": "Предыдущий период", + "unavailable": { + "lastMonth": "Сравнение недоступно: данных за прошлый месяц пока нет", + "lastYear": "Сравнение недоступно: данных за прошлый год пока нет" + }, + "notAvailableForCompliance": "Сравнение неприменимо к приверженности" + }, + "insights": { + "pattern": { + "dismiss": "Закрыть", + "dismissed": "Эта закономерность скрыта, пока не изменятся её данные.", + "restore": "Показать снова", + "dismissError": "Не удалось скрыть эту закономерность.", + "restoreError": "Не удалось вернуть эту закономерность.", + "loadError": "Не удалось загрузить закономерности.", + "empty": "Ни одна текущая закономерность не прошла порог доказательности.", + "seasonalNote": "С версии 1.42 HealthLog убирает сезонность и долгосрочную динамику перед сравнением значений. Связей видно меньше, но оставшиеся держатся лучше. Многие прежние закономерности были просто календарём.", + "seasonalNoteDismiss": "Закрыть заметку" + }, + "correlation": { + "direction": { + "higher": "выше", + "lower": "ниже" + }, + "weekdayDirection": { + "above": "выше", + "below": "ниже" + }, + "channelFactor": "оценка {factor}", + "channel": { + "WEIGHT": "вес", + "BLOOD_GLUCOSE": "глюкоза крови", + "BLOOD_PRESSURE_SYS": "систолическое АД", + "BLOOD_PRESSURE_DIA": "диастолическое АД", + "ACTIVITY_STEPS": "шаги за день", + "SLEEP_DURATION": "длительность сна", + "HEART_RATE_VARIABILITY": "вариабельность сердечного ритма", + "RESTING_HEART_RATE": "ЧСС в покое", + "TIME_IN_DAYLIGHT": "время на дневном свете", + "MOOD": "настроение", + "PULSE": "пульс в покое", + "MEDICATION_COMPLIANCE": "приверженность лекарствам", + "SYMPTOM_SEVERITY": "тяжесть симптомов", + "ENV_TEMP_MEAN": "температура за день", + "ENV_TEMP_MIN": "ночной минимум температуры", + "ENV_SUNSHINE": "солнечный свет", + "ENV_DAYLIGHT": "дневной свет", + "ENV_PRECIP": "осадки", + "ENV_PRESSURE_MEAN": "барометрическое давление", + "ENV_PRESSURE_DELTA": "суточный перепад давления", + "ENV_PM25": "мелкие частицы (PM2.5)", + "ENV_OZONE_8H": "озон", + "ENV_POLLEN_MAX": "пыльца", + "HRV_RMSSD": "вариабельность сердечного ритма (RMSSD)", + "HYDRATION": "приём воды", + "CAFFEINE": "приём кофеина", + "ALCOHOL": "употребление алкоголя", + "WORKOUT_MINUTES": "минуты тренировок", + "TRAINING_LOAD": "тренировочная нагрузка", + "EXERCISE_MINUTES": "минуты упражнений", + "STAND_MINUTES": "минуты стояния", + "MINDFUL_MINUTES": "минуты осознанности", + "STATE_OF_MIND_VALENCE": "записанное состояние души", + "INDOOR_CO2": "CO2 в помещении", + "INDOOR_TEMPERATURE": "температура в комнате", + "INDOOR_HUMIDITY": "влажность в комнате" + }, + "daily": { + "high": "Более высокий показатель «{behaviour}» в ваших данных обычно связан с {direction} {outcome} на следующий день. Это закономерность для наблюдения, а не причина.", + "moderate": "Более высокий показатель «{behaviour}», судя по имеющимся данным, связан с {direction} {outcome} на следующий день. Это закономерность для наблюдения, а не причина.", + "faint": "Более высокий показатель «{behaviour}» в ваших данных даёт в лучшем случае слабый намёк на {direction} {outcome} на следующий день. Это слишком мало, чтобы опираться, и никогда не причина." + }, + "lab": { + "default": "Более высокие значения «{lab}» совпадают с {direction} {outcome} за те же периоды в ваших данных — связь, которую стоит обсудить с врачом, но никогда не причина.", + "faint": "Более высокие значения «{lab}» дают в лучшем случае слабый намёк на {direction} {outcome} за те же периоды в ваших данных. Это слишком мало, чтобы опираться, и никогда не причина, но стоит поднять вопрос у врача." + }, + "hypothesis": { + "bpCompliance": { + "support": "Более высокая приверженность лекарствам совпадает с более низкими систолическими значениями — закономерность для наблюдения.", + "surprising": "Приверженность и систолическое давление в ваших данных движутся вместе, что удивительно. Поговорите с врачом, прежде чем что-либо менять.", + "none": "Приверженность и систолическое давление в этом окне не движутся вместе заметно." + }, + "moodPulse": { + "support": "Дни с более низким настроением совпадают с более высоким пульсом в покое — закономерность для наблюдения.", + "surprising": "Дни с более высоким настроением в ваших данных совпадают с более высоким пульсом в покое, что удивительно.", + "none": "Настроение и пульс в покое в этом окне не движутся вместе заметно." + }, + "weightWeekday": "Вес по {weekday} идёт на {delta} кг {direction} вашего среднего за другие дни — закономерность для наблюдения." + }, + "dailySameDay": { + "high": "Более высокий показатель «{behaviour}» в этот день и накануне в ваших данных обычно связан с {direction} {outcome}. Это закономерность для наблюдения, а не причина.", + "moderate": "Более высокий показатель «{behaviour}» в этот день и накануне, судя по имеющимся данным, связан с {direction} {outcome}. Это закономерность для наблюдения, а не причина.", + "faint": "Более высокий показатель «{behaviour}» в этот день и накануне даёт в лучшем случае слабый намёк на {direction} {outcome} в ваших данных. Это слишком мало, чтобы опираться, и никогда не причина." + }, + "channelNutrient": "приём {nutrient}", + "dailyOvernight": { + "high": "Более высокий показатель «{behaviour}» за ночь в ваших данных обычно связан с {direction} {outcome} в ту же ночь. Это закономерность для наблюдения, а не причина.", + "moderate": "Более высокий показатель «{behaviour}» за ночь, судя по имеющимся данным, связан с {direction} {outcome} в ту же ночь. Это закономерность для наблюдения, а не причина.", + "faint": "Более высокий показатель «{behaviour}» за ночь в ваших данных даёт в лучшем случае слабый намёк на {direction} {outcome} в ту же ночь. Это слишком мало, чтобы опираться, и никогда не причина." + } + }, + "noAnalysisYet": "Оценки пока нет.", + "assessmentPreparing": "Подготовка вашей оценки…", + "emptyTitle": "Пока недостаточно данных", + "emptyDescription": "Аналитика появится, когда вы запишете несколько измерений. Начните с веса или АД.", + "emptyAddMeasurement": "Добавить измерение", + "editMode": { + "done": "Готово", + "reset": "Сбросить", + "resetTitle": "Сбросить обзор?", + "resetBody": "Порядок разделов и скрытые разделы вернутся к значениям по умолчанию. Ваше расположение больше нигде не хранится.", + "resetConfirm": "Сбросить обзор", + "title": "Настроить обзор", + "description": "Перетащите для изменения порядка, нажмите на глаз, чтобы показать или скрыть.", + "dragHandle": "Перетащите для изменения порядка", + "show": "Показать", + "hide": "Скрыть", + "manageInSettings": "Управление чипами и страницами деталей в настройках", + "groupSleep": "Сон", + "groupMood": "Настроение", + "groupEvents": "События", + "gatedHint": "Появится, когда будут данные или функция", + "allHiddenHint": "Все разделы скрыты. Покажите хотя бы один, чтобы увидеть обзор.", + "saveSuccess": "Расположение обзора сохранено", + "saveError": "Не удалось сохранить расположение обзора", + "resetSuccess": "Обзор сброшен по умолчанию", + "emptyTitle": "Все карточки скрыты", + "emptyDescription": "Вы скрыли все разделы. Откройте настройку, чтобы вернуть карточки." + }, + "bmiEmptyTitle": "Укажите рост, чтобы увидеть ИМТ", + "bmiEmptyDescription": "Для ИМТ нужен ваш рост. Добавьте его в разделе «Настройки» → «Аккаунт».", + "bmiEmptyAction": "Открыть настройки аккаунта", + "personalRecord": { + "badge": "Рекорд", + "tooltip": "Личный рекорд: {value} {unit} {date}", + "benchmark": "Типично в этом возрасте: {low} до {high} {unit} ({source})" + }, + "loadError": "Не удалось загрузить аналитику", + "heroPersonalBaseline": "На основе ваших последних 90 дней", + "heroRegenerating": "Обновление", + "regenerateAnalysis": "Повторить оценку", + "regenerateSuccess": "Оценка обновлена", + "narrativeTitle": "На рассмотрении", + "narrativeWeek": "На этой неделе", + "narrativeMonth": "В этом месяце", + "narrativeUpdating": "Обновление…", + "heroFallbackSubtitle": "Ежедневный обзор вашей динамики, прямо из записанных вами чисел.", + "heroGreetingMorning": "Доброе утро", + "heroGreetingAfternoon": "Добрый день", + "heroGreetingEvening": "Добрый вечер", + "heroActionAskCoach": "Спросить коуча", + "healthScore": { + "label": "Балл здоровья", + "band": { + "green": "В референсном диапазоне", + "yellow": "Некоторым опорам нужно внимание", + "red": "Одна или несколько опор вне референсного диапазона" + }, + "insufficient": "Пока ни у одной области недостаточно свежих данных для оценки. Для начала достаточно одной области здоровья, и балл укажет, на каких областях он основан.", + "basis": "На основе {count} из {recommended} областей здоровья.", + "compositionNotice": { + "item": "{pillar} ({reason})", + "left": "Больше не учитывается в балле: {pillars}.", + "joined": "Теперь учитывается в балле: {pillars}." + }, + "anatomyToggle": "Как складывается этот балл", + "notScored": "Пока не оценено ({count})", + "method": "Балл — это среднее с равными весами опор, которые в него входят, по шкале от 0 до 100. Каждая опора оценивается по опубликованному референсному диапазону, и самая слабая опора может задать общий диапазон. Опора без достаточного количества свежих данных исключается, а не считается нулём. Референсные диапазоны взяты из опубликованных источников; какие опоры учитывать — ваш выбор, поэтому итоговое число само по себе не является клиническим стандартом.", + "bandSetter": "Общий диапазон задан опорой «{pillar}»", + "versionAndNoise": "Версия метода {version}. Порог недельного сравнения: {noise} баллов.", + "methodVersion": "Версия метода {version}.", + "configured": "Вы выбрали, какие опоры входят в этот балл.", + "none": "нет", + "delta": "{delta} к предыдущему сопоставимому окну", + "deltaReason": { + "algorithm_changed": "Сравнения нет, так как изменился метод расчёта балла.", + "config_changed": "Сравнения нет, так как вы изменили, что входит в ваш балл.", + "composition_changed": "Сравнения нет, так как изменился набор включённых опор.", + "first_eligibility_window": "Сравнения нет, так как это первое подходящее окно.", + "below_noise_floor": "Изменение в пределах суммарного шума измерений.", + "no_previous_window": "Нет сопоставимого более раннего окна.", + "no_current_score": "Сравнения нет, так как текущее окно не подходит." + }, + "restMode": "Режим отдыха активен с {since}. Балл показан для контекста и не снижается.", + "pillar": { + "bloodPressure": "АД", + "glycaemia": "Гликемия", + "activity": "Активность", + "sleep": "Сон", + "adiposity": "Жировая масса", + "wellbeing": "Благополучие", + "lipids": "Липиды" + }, + "observed": "Наблюдаемое: {value}", + "reference": "Референс: {value}", + "fastingObserved": "Глюкоза натощак: {value} {unit}", + "fastingReference": "{low} до {high} {unit} натощак", + "personalReference": "Ваша цель: {value}", + "bpBasisAbove": "Балл задаёт {axis}: примерно на {offset} мм рт. ст. выше верхней границы {boundary} мм рт. ст.", + "bpBasisBelowFloor": "Балл задаёт {axis}: примерно на {offset} мм рт. ст. ниже нижней границы {boundary} мм рт. ст.", + "bpBasisInBand": "Оба значения на уровне или ниже своих референсных верхних границ.", + "bpScale": "На верхней границе балл равен 85; 100 означает примерно на 12 мм рт. ст. ниже неё.", + "bpRepresentative": "На основе среднего за последние {days} дней с учётом давности, поэтому может не совпадать ни с одним отдельным измерением.", + "source": "Источник: {source}, по состоянию на {date}", + "observedActivity": "{value} шагов в день", + "observedSleep": "{value} минут за ночь", + "observedAdiposity": "Отношение талии к росту {value}", + "referenceActivity": "Польза выходит на плато к {high} шагам в день", + "referenceSleep": "Не менее {low} минут за ночь; более длительный сон не штрафуется", + "referenceAdiposity": "Отношение талии к росту ниже {high}", + "referenceHba1c": "HbA1c (гликированный гемоглобин) {low} до {high}%", + "referenceDetail": "{label}: {low} до {high} ({kind}, {source})", + "openBound": "открыто", + "laboratoryReferenceSource": "Референсные диапазоны лаборатории", + "personalTargetSource": "Личная цель", + "referenceKind": { + "clinical": "Клинический порог", + "population": "Популяционный процентиль", + "guideline": "Диапазон по руководству" + }, + "reason": { + "readFailed": "Не удалось загрузить данные", + "notTracked": "Не отслеживается", + "missingProfile": "Не хватает возраста или референсного профиля", + "missingHeight": "Не хватает роста", + "incompletePanel": "Нужна недавняя полная панель с референсными диапазонами", + "crisis": "Вместо балла показаны рекомендации по безопасности", + "insufficientHistory": "Недостаточно свежих подходящих данных", + "unavailable": "Эта опора сейчас не подходит" + }, + "tension": "Сигналы готовности расходятся. Поддерживающие: {positive}. Под нагрузкой: {negative}.", + "returnToBand": "{metric} снова в вашем обычном диапазоне уже {days} дней.", + "weightGoal": { + "title": "Личная цель по весу", + "value": "Сейчас {current} {unit}. Цель {min} до {max} {unit}. До цели: {distance} {unit}.", + "delta": "Расстояние до цели изменилось на {delta} {unit} с предыдущего измерения.", + "noDelta": "Нет более раннего измерения веса для сравнения.", + "no_personal_goal": "Задайте личную цель по весу, чтобы видеть прогресс здесь.", + "weight_not_tracked": "Запишите измерение веса, чтобы видеть прогресс к цели.", + "read_failed": "Не удалось загрузить данные о весе. Попробуйте ещё раз.", + "notScored": "Прогресс к цели по весу — личный контекст и не влияет на балл здоровья." + }, + "configureLink": "Выберите, что входит в ваш балл", + "coverage": { + "recommendedMet": "Охватывает три области, которые рекомендует балл", + "areas": "{present} из {required} областей здоровья" + }, + "historyLink": "История" + }, + "dailyBriefing": { + "title": "Ежедневная сводка", + "keyFindingsTitle": "Ключевые находки", + "signalsTitle": "Сигналы дня", + "emptyTitle": "Сводки пока нет", + "emptyDescription": "Создайте сводку на сегодня, чтобы получить текстовый обзор вашей динамики.", + "emptyAction": "Создать сводку", + "loadingLabel": "Составление сводки на сегодня", + "refreshFailedHint": "Не удалось обновить сводку. Показана последняя.", + "retryAction": "Повторить", + "failedTitle": "Не удалось создать сводку", + "failedDescription": "Провайдер ИИ не ответил вовремя или вернул ошибку. Попробуйте ещё раз или увеличьте тайм-аут ответа в настройках ИИ для медленной локальной модели.", + "failedDescriptionTimeout": "Запрос к ИИ не успел завершиться до готовности сводки. Для медленной локальной модели увеличьте тайм-аут ответа ИИ в настройках и попробуйте ещё раз.", + "failedDescriptionProvider": "Провайдер ИИ отклонил запрос. Проверьте провайдера и ключ API в настройках ИИ и попробуйте ещё раз.", + "failedDescriptionRateLimit": "Провайдер ИИ сейчас ограничивает частоту запросов. Попробуйте ещё раз чуть позже.", + "omittedTitle": "Сводка не показана", + "omittedUngroundedDescription": "В созданной сводке упоминалась цифра, которую не удалось сверить с вашими данными, поэтому она не показана. Попробуйте ещё раз." + }, + "trendsRow": { + "title": "Динамика", + "subtitle": "Последние 30 дней с первого взгляда", + "caption": { + "bp": "Систолические и диастолические измерения за последние 30 дней.", + "weight": "Динамика веса за последние 30 дней.", + "pulse": "Пульс в покое за последние 30 дней.", + "mood": "Балл настроения за день за последние 30 дней.", + "sleep": "Длительность сна за ночь за последние 30 дней.", + "steps": "Шаги за день за последние 30 дней.", + "hrv": "Вариабельность сердечного ритма за последние 30 дней.", + "resting_hr": "ЧСС в покое за последние 30 дней.", + "active_energy": "Активная энергия за последние 30 дней.", + "flights": "Этажи за последние 30 дней.", + "distance": "Расстояние ходьбы и бега за последние 30 дней.", + "vo2_max": "VO₂ max за последние 30 дней.", + "body_temp": "Температура тела за последние 30 дней." + }, + "viewDetail": "Открыть детали {metric}" + }, + "vo2Max": { + "cardioLinkTitle": "Кардио-фитнес (VO₂ max)", + "cardioLinkBody": "VO₂ max — главный показатель аэробной формы. Полный график и оценка находятся на отдельной странице.", + "cardioLinkCta": "Открыть кардио-фитнес" + }, + "trendAnnotation": { + "emptyBp": "Ждём больше данных, чтобы прокомментировать эту динамику.", + "emptyWeight": "Ждём больше данных, чтобы прокомментировать эту динамику.", + "emptyMood": "Ждём больше данных, чтобы прокомментировать эту динамику.", + "confidenceHigh": "Высокая уверенность", + "confidenceModerate": "Умеренная уверенность", + "confidenceLow": "Низкая уверенность", + "pendingLabel": "Создание комментария к динамике" + }, + "correlationRow": { + "title": "Связи", + "experimentCta": "Попробовать 7-дневный эксперимент", + "experimentTooltip": "Скоро", + "emptyTitle": "Нужно больше данных, чтобы увидеть эту связь", + "sourceChip": "на основе {n} парных измерений ({window})", + "sourceWindowLast30": "последние 30 дней", + "confidenceHigh": "Высокая уверенность", + "confidenceModerate": "Умеренная уверенность", + "confidenceLow": "Низкая уверенность", + "card": { + "bpComplianceTitle": "АД × приверженность лекарствам", + "bpComplianceSubtitle": "Дневное систолическое против приверженности в %", + "moodPulseTitle": "Настроение × пульс в покое", + "moodPulseSubtitle": "Настроение и пульс в покое в один день", + "weightWeekdayTitle": "Вес × день недели", + "weightWeekdaySubtitle": "Вес по дням недели" + } + }, + "coach": { + "refusalOutOfScope": "Я могу помочь только с показателями здоровья из ваших записей: измерения, лекарства, настроение, динамика. На вопросы вне этой области я не отвечаю.", + "refusalInjection": "Я заметил формулировку, которая пытается переопределить мои инструкции. Я коуч HealthLog и только обобщаю ваши собственные данные о здоровье. Переформулируйте вопрос в этих терминах.", + "errorBudget": "Вы достигли дневного лимита использования коуча. Бюджет обновится в полночь по вашему часовому поясу.", + "errorProvider": "Коуч не смог связаться с провайдером аналитики. Попробуйте ещё раз через момент.", + "errorReasoningOnly": "Модель только рассуждала и так и не написала ответ. Попробуйте ещё раз или выберите другую модель в настройках ИИ.", + "errorDemo": "В демо-режиме коуч не отвечает.", + "errorNoProvider": "Коуч читает записанные вами данные о здоровье и отвечает на вопросы о них (не медицинские советы). Для этого HealthLog нужен провайдер ИИ. Подключите свой ключ или локальную модель.", + "errorNoProviderAction": "Подключить провайдера ИИ", + "errorNetwork": "Нет подключения к интернету. Попробуйте ещё раз, когда снова будете онлайн.", + "prefsSaveError": "Не удалось сохранить настройки коуча. Попробуйте ещё раз.", + "errorCredentialExpired": "Подключение к провайдеру ИИ истекло. Переподключите его в настройках, чтобы коуч продолжал работать.", + "tagline": "Личный коуч по здоровью, опирающийся на ваши данные.", + "newChat": "Новый чат", + "docScope": { + "badge": "Документ", + "chattingAbout": "Чат о: {title}", + "chattingAboutMore": "Чат о: {titles} и ещё {count}", + "notIndexedHint": "Сначала прочитайте этот документ с помощью ИИ в хранилище, чтобы коуч мог отвечать о нём." + }, + "actionsMenu": "Действия", + "maximizeAriaLabel": "Открыть на всю страницу", + "minimizeAriaLabel": "Назад к панели", + "send": "Отправить", + "stop": "Остановить", + "thinking": "Думаю…", + "unverifiedFiguresNotice": "Некоторые цифры не удалось сверить с вашими данными, и они были опущены.", + "composerPlaceholder": "Спросите меня о чём угодно…", + "nudgeBubbleLabel": "Новое сообщение от коуча. Открыть чат", + "fabLabel": "Открыть коуча", + "readAloud": "Прочитать вслух", + "readAloudStop": "Остановить чтение", + "messageTimeLabel": "Сообщение отправлено {time}", + "copyMessage": "Копировать", + "copyMessageError": "Не удалось скопировать", + "regenerate": "Попробовать ещё раз", + "selfContextAdopt": { + "offer": "Добавить этот ответ в ваш самоконтекст?", + "confirm": "Добавить", + "dismiss": "Закрыть", + "done": "Добавлено в ваш самоконтекст", + "duplicate": "Уже часть вашего самоконтекста", + "failed": "Не удалось добавить. Попробуйте ещё раз." + }, + "rememberMessage": { + "action": "Запомнить", + "failed": "Не удалось сохранить. Попробуйте ещё раз.", + "alreadyKept": "Коуч уже это помнит." + }, + "guided": { + "offerTitle": "У коуча есть для вас вопросов: {count}", + "offerTitleOne": "У коуча есть для вас уточняющий вопрос", + "offerBody": "Короткие ответы уточняют ваш самоконтекст, по одному вопросу за раз, прямо здесь в чате.", + "offerStart": "Ответить сейчас", + "offerLater": "Позже", + "offerDismiss": "Больше не спрашивать", + "dismissError": "Не удалось скрыть вопросы. Попробуйте ещё раз.", + "progress": "Вопрос {current} из {total}", + "skip": "Пропустить", + "later": "Позже", + "dismissRemaining": "Больше не спрашивать", + "answerPlaceholder": "Введите ответ…", + "summaryTitle": "Готово, спасибо за ответы!", + "summaryAnswered": "Отвечено {answered} из {total}", + "summaryAdopted": "Добавлено в ваш самоконтекст: {adopted}", + "summaryAdoptedNone": "в ваш самоконтекст ничего нового не добавлено", + "summaryLink": "Просмотреть ваш самоконтекст" + }, + "threadEmpty": "Спросите о чём угодно из вашей динамики, лекарств или измерений, чтобы начать разговор.", + "historyTitle": "Разговоры", + "historySearchPlaceholder": "Поиск разговоров…", + "historyEmpty": "Здесь появятся ваши разговоры. Задайте вопрос, чтобы начать.", + "historyDeleteAria": "Удалить разговор", + "historyDeleted": "Разговор удалён", + "historyDeleteFailed": "Не удалось удалить разговор.", + "rename": { + "action": "Переименовать разговор", + "input": "Название разговора", + "save": "Сохранить название", + "cancel": "Отменить переименование", + "error": "Не удалось сохранить название разговора." + }, + "historySearchEmpty": "Нет разговоров, соответствующих поиску.", + "historyLoadingMore": "Загрузка…", + "sourcesTitle": "Что я вижу", + "sourcesFresh": "Свежие", + "sourcesStale": "Устаревшие", + "sourcesFooter": "Коуч читает только подключённые вами данные.", + "metric": { + "bp": "АД", + "weight": "Вес", + "pulse": "Пульс", + "mood": "Настроение", + "compliance": "Приверженность", + "general": "Общее", + "hrv": "Вариабельность сердечного ритма", + "sleep": "Сон", + "resting_hr": "ЧСС в покое", + "steps": "Шаги", + "active_energy": "Активная энергия", + "flights": "Этажи", + "distance": "Расстояние", + "vo2_max": "VO₂ max", + "body_temp": "Температура тела", + "medications": "Лекарства", + "anthropometrics": "Профиль (рост, возраст, пол)", + "walking_hr": "ЧСС при ходьбе", + "respiratory_rate": "Частота дыхания", + "spo2": "Кислород в крови", + "pulse_wave_velocity": "Скорость пульсовой волны", + "vascular_age": "Сосудистый возраст", + "body_fat": "Жировая масса", + "fat_mass": "Жировая масса", + "fat_free_mass": "Обезжиренная масса", + "muscle_mass": "Мышечная масса", + "lean_body_mass": "Тощая масса тела", + "bone_mass": "Костная масса", + "total_body_water": "Вода в организме", + "bmi": "ИМТ", + "visceral_fat": "Висцеральный жир", + "glucose": "Глюкоза", + "walking_steadiness": "Устойчивость ходьбы", + "walking_asymmetry": "Асимметрия ходьбы", + "walking_double_support": "Время двойной опоры", + "walking_step_length": "Длина шага", + "walking_speed": "Скорость ходьбы", + "audio_env": "Окружающий звук", + "audio_headphone": "Звук в наушниках", + "audio_event": "События громкого звука", + "daylight": "Время на дневном свете", + "skin_temp": "Температура кожи", + "workouts": "Тренировки" + }, + "settingsAriaLabel": "Настройки коуча", + "settingsTitle": "Настройки коуча", + "settingsDescription": "Настройте, как коуч общается с вами.", + "settingsToneLabel": "Тон", + "settingsToneWarm": "Тёплый", + "settingsToneNeutral": "Нейтральный", + "settingsToneConcise": "Лаконичный", + "settingsVerbosityLabel": "Длина ответа", + "settingsVerbosityBrief": "Кратко", + "settingsVerbosityDefault": "По умолчанию", + "settingsVerbosityDetailed": "Подробно", + "settingsVerbosityConciseHint": "Лаконичный тон и так делает ответы короткими, поэтому при нём длина ответа закреплена как «Кратко».", + "settingsSourcesSummary": "Коуч видит {count} из {total} областей данных и заглядывает на {window}.", + "settingsSourcesSummaryAll": "Коуч видит {count} из {total} областей данных и всю вашу историю.", + "settingsSourcesPointerLink": "Открыть настройки коуча", + "settingsExcludeLabel": "Исключить показатели", + "settingsExcludeHint": "Коуч не будет видеть данные выбранных показателей.", + "settingsContextLabel": "Включать контекст", + "settingsContextHint": "Необязательные блоки, на которые может опираться коуч. Выключите блок, и он будет исключён из каждого хода.", + "settingsEvidenceLabel": "Показывать обоснование по умолчанию", + "settingsEvidenceHint": "Автоматически раскрывать блок под каждым ответом.", + "settingsDefaultWindowLabel": "Окно анализа по умолчанию", + "settingsDefaultWindowHint": "Коуч читает столько истории за чат, если вы не переопределите это в заголовке панели.", + "settingsSave": "Сохранить", + "settingsSaved": "Сохранено", + "settingsCancel": "Отмена", + "dailyLimitTitle": "Достигнут дневной лимит", + "dailyLimitBody": "Достигнут дневной лимит. Бюджет обновится в полночь по вашему часовому поясу.", + "providerRateLimitTitle": "Провайдер ограничил частоту", + "providerRateLimitBody": "Провайдер временно ограничил частоту; повторите примерно через 5 мин.", + "cluster": { + "cardio": { + "label": "Сердечно-сосудистая система", + "hint": "АД, пульс, вариабельность сердечного ритма, ЧСС в покое и при ходьбе" + }, + "body": { + "label": "Состав тела", + "hint": "Вес, жировая масса, мышцы и ИМТ" + }, + "activity": { + "label": "Активность", + "hint": "Шаги, энергия, расстояние и VO₂ max" + }, + "workouts": { + "label": "Тренировки", + "hint": "Бег, велосипед и занятия" + }, + "sleep": { + "label": "Сон", + "hint": "Длительность и фазы" + }, + "mood": { + "label": "Настроение", + "hint": "Записи настроения за день" + }, + "glucose": { + "label": "Глюкоза", + "hint": "Измерения натощак и после еды" + }, + "medication": { + "label": "Лекарства", + "hint": "Приверженность и контекст GLP-1" + }, + "mobility": { + "label": "Подвижность и походка", + "hint": "Устойчивость, асимметрия и походка" + }, + "environment": { + "label": "Окружение", + "hint": "Шум, дневной свет и температура кожи" + } + }, + "settingsClustersLabel": "Данные, которые видит коуч", + "settingsClustersHint": "Выберите, какие кластеры ваших данных может читать коуч. Больше данных — богаче ответы и больше запрос.", + "settingsClusterNoData": "Данных пока нет", + "sourcesMemberCountOne": "1 показатель", + "sourcesMemberCountFew": "{count} показателя", + "sourcesMemberCountOther": "{count} показателей", + "lookback": { + "label": "Насколько далеко коуч может заглядывать", + "option": { + "last7days": "Дней: {days}", + "last30days": "Дней: {days}", + "last90days": "Дней: {days}", + "lastYear": "{months} месяцев", + "allTime": "{months} месяцев подробно, дольше для анализов" + }, + "detailDays": "Коуч не читает ничего старше {days} дней ни в одном ответе.", + "detailMonths": "Коуч не читает ничего старше {months} месяцев ни в одном ответе.", + "detailAll": "Без ограничения коуч читает {dailyMonths} месяцев измерений в дневной детализации, а более старые — как месячные значения вплоть до {years} лет назад. Для результатов анализов он читает последнее значение самых недавно измеренных показателей и, для показателя, о котором вы спрашиваете, его {labRecent} предыдущих результатов, а более старые обобщает по годам вплоть до {labYears} лет назад; более ранние годы только учитываются.", + "note": "Ваш профиль, текущие лекарства, текущее заболевание и предстоящие визиты остаются видимыми; сводки, которым нужно больше истории, сокращаются или опускаются. Ответы, которые коуч давал раньше в старых разговорах, могут по-прежнему цитировать старые значения." + }, + "showConversations": "Показать разговоры", + "hideConversations": "Скрыть разговоры", + "heroGreeting": "Спросите меня о чём угодно из ваших данных", + "heroSubline": "Спросите о вашей динамике, лекарствах или измерениях.", + "thinkingDuration": "Думал {seconds} с", + "thinkingExpandAria": "Показать, что учёл коуч", + "thinkingDetail": "Ответ на основе вашего снимка здоровья.", + "tokensUsed": "{count} токенов", + "askAboutThis": "Спросить коуча об этом", + "readStrip": { + "label": "Обычный диапазон", + "baselineWithin": "Ваш обычный диапазон — {low}–{high} {unit}; сегодняшнее {value} находится в нём.", + "baselineAbove": "Ваш обычный диапазон — {low}–{high} {unit}; сегодняшнее {value} выше него.", + "baselineBelow": "Ваш обычный диапазон — {low}–{high} {unit}; сегодняшнее {value} ниже него.", + "sameHoursWithin": "К этому времени дня вы обычно находитесь на {low}–{high} {unit}; сегодня пока {value} в этих пределах.", + "sameHoursAbove": "К этому времени дня вы обычно находитесь на {low}–{high} {unit}; сегодня пока {value} выше этого.", + "sameHoursBelow": "К этому времени дня вы обычно находитесь на {low}–{high} {unit}; сегодня пока {value} ниже этого.", + "steadyWithin": "Ваши измерения обычно находятся на {low} {unit}; сегодняшнее {value} совпадает.", + "steadyAbove": "Ваши измерения обычно находятся на {low} {unit}; сегодняшнее {value} выше этого.", + "steadyBelow": "Ваши измерения обычно находятся на {low} {unit}; сегодняшнее {value} ниже этого.", + "latestWithin": "Ваш обычный диапазон — {low}–{high} {unit}; ваше последнее измерение, {date}, было {value}, в его пределах.", + "latestAbove": "Ваш обычный диапазон — {low}–{high} {unit}; ваше последнее измерение, {date}, было {value}, выше него.", + "latestBelow": "Ваш обычный диапазон — {low}–{high} {unit}; ваше последнее измерение, {date}, было {value}, ниже него.", + "steadyLatestWithin": "Ваши измерения обычно находятся на {low} {unit}; ваше последнее измерение, {date}, было {value} и совпадает.", + "steadyLatestAbove": "Ваши измерения обычно находятся на {low} {unit}; ваше последнее измерение, {date}, было {value}, выше этого.", + "steadyLatestBelow": "Ваши измерения обычно находятся на {low} {unit}; ваше последнее измерение, {date}, было {value}, ниже этого.", + "insufficient": "Ещё изучаю ваш обычный диапазон. Продолжайте записывать ещё несколько дней.", + "driver": "{note}", + "loadError": "Не удалось загрузить ваш обычный диапазон." + }, + "scope": { + "prefix": "Коуч уже настроен на {metric}" + }, + "settings": "Настройки", + "history": { + "groupToday": "Сегодня", + "groupYesterday": "Вчера", + "groupThisWeek": "На этой неделе", + "groupEarlier": "Ранее" + }, + "seed": { + "bloodPressure": "Проведите меня по динамике моего АД за последние 30 дней. На что стоит обратить внимание?", + "weight": "Как в последнее время меняется мой вес и стоит ли что-то делать с этим направлением?", + "bmi": "Что мне говорит динамика моего ИМТ и как её читать?", + "pulse": "Проведите меня по моим измерениям пульса. Есть ли что-то необычное?", + "restingHr": "Как менялась моя ЧСС в покое и что это говорит о моей форме?", + "hrv": "Что моя вариабельность сердечного ритма говорит о восстановлении и стрессе в последнее время?", + "sleep": "Проведите меня по моему недавнему сну: длительность, регулярность и что стоит изменить.", + "mood": "Какие закономерности вы видите в моём настроении за последние несколько недель?", + "medications": "Как выглядит моя приверженность лекарствам и совпадает ли она с тем, как я себя чувствовал?", + "steps": "Насколько я был активен в последнее время по шагам и как это соотносится со здоровой нормой?", + "activeEnergy": "Что динамика моей активной энергии говорит об уровне моей активности в последнее время?", + "cardioFitness": "Что означает динамика моей кардио-формы (VO₂ max) и как направить её в нужную сторону?", + "bloodGlucose": "Проведите меня по моим недавним измерениям глюкозы. Они в здоровом диапазоне?", + "oxygenSaturation": "Что мне говорит динамика насыщения кислородом (SpO₂)?", + "respiratoryRate": "Что динамика моей частоты дыхания говорит о моём здоровье?", + "workouts": "Проведите меня по моим недавним тренировкам: нагрузка, частота и как я восстанавливаюсь между ними.", + "recoveryPage": "Почему моё восстановление сейчас такое и что на него влияет?", + "briefing": "Проведите меня по сегодняшней сводке. На чём мне сосредоточиться и стоит ли что-то предпринять?", + "healthScore": "Почему мой балл здоровья {score} из 100 и что сдвинуло бы его сильнее всего?", + "periodWeek": "Проведите меня по тому, как прошла моя последняя неделя по показателям здоровья. Что выделяется?", + "periodMonth": "Проведите меня по тому, как прошёл мой последний месяц по показателям здоровья. Что выделяется?", + "correlationBpCompliance": "Как моя приверженность лекарствам связана с моим АД? Объясните, что эта корреляция значит для меня.", + "correlationMoodPulse": "Есть ли реальная связь между моим настроением и пульсом? Помогите мне прочитать эту корреляцию.", + "correlationWeightWeekday": "Мой вес следует недельному ритму? Что говорит мне эта корреляция с днём недели?", + "recommendation": "Расскажи подробнее об этой рекомендации: \"{text}\" Почему она относится ко мне и что мне с ней делать?" + }, + "assessmentPrompt": "Проведи меня по моей оценке {metric}. Что она значит и что мне с ней делать?", + "attach": { + "menuChooseFromDocuments": "Выбрать из документов", + "menuUploadNew": "Загрузить новый документ", + "trigger": "Прикрепить документы", + "pickerTitle": "Прикрепить документы", + "pickerDescription": "Коуч читает только прикреплённые документы, а не ваши данные о здоровье.", + "pickerSearchPlaceholder": "Поиск документов…", + "pickerEmpty": "В вашем хранилище пока нет документов.", + "pickerNotIndexed": "Ещё не проиндексировано", + "pickerCap": "Можно прикрепить ещё до {max}.", + "pickerConfirm": "Прикрепить ({count})", + "pillRemove": "Убрать {title}", + "indexing": "Индексация…", + "indexingHint": "Документ ещё индексируется. Отправить можно, когда он будет готов.", + "fencedHint": "Этот разговор идёт без доступа к вашим данным о здоровье. Коуч читает только прикреплённые документы.", + "documentsAttachedOne": "Прикреплён 1 документ", + "documentsAttachedOther": "Прикреплено документов: {count}", + "railBadge": "Изолированный чат по документам", + "uploadError": "Загрузка не удалась. Попробуйте ещё раз.", + "notFoundError": "Эта ссылка на документ больше недействительна. Начинаем обычный чат." + }, + "interrupted": { + "note": "Этот ответ был прерван до завершения.", + "retry": "Спросить снова" + }, + "historyReadOnlyNote": "Коуч сейчас недоступен, но вы можете читать и удалять свои разговоры.", + "transcriptYou": "Вы", + "transcriptCoach": "Тренер", + "errorConsent": "Коучу нужно ваше согласие на ИИ, прежде чем он сможет ответить. Дать его можно в разделе «Настройки, ИИ».", + "errorNotPermitted": "Коуч недоступен внутри записи, которой с вами поделились.", + "errorUnavailable": "Коуч не смог только что проверить свои настройки. Попробуйте ещё раз через минуту.", + "errorOperatorOff": "ИИ выключен на этом сервере, поэтому коуч не может ответить.", + "errorCoachOff": "Коуч выключен. Включить его снова можно в разделе «Настройки, Модули».", + "frame": { + "showPanel": "Показать разговоры", + "hidePanel": "Скрыть разговоры", + "panelDescription": "Ваши разговоры с коучем, сначала новые.", + "rowActions": "Действия для {title}", + "rename": "Переименовать", + "delete": "Удалить", + "modelSection": "Модель", + "provider": "Отвечает через", + "modelManaged": "Модель для этого провайдера задаётся в настройках ИИ.", + "noProvider": "Нет доступного провайдера", + "allSettings": "Все настройки ИИ", + "operatorCodex": "ChatGPT (предоставлен оператором)", + "changeModel": "Изменить в разделе «Настройки > ИИ»", + "saving": "Сохранение…", + "saveFailed": "Это изменение не удалось сохранить.", + "providerNotActive": "{provider} не смог подключиться: у него нет рабочего входа или ключа. Настройте его в настройках ИИ.", + "operatorManaged": "Это подключение управляется оператором вашего сервера. Как только будет настроен один из ваших собственных провайдеров, отвечать будет он." + }, + "answer": { + "scrollToBottom": "Перейти к последнему сообщению", + "rememberDone": "Запомнено", + "timeYesterday": "вчера {time}", + "timeEarlier": "{date}, {time}", + "info": "Подробности ответа", + "infoModel": "Модель: {model}" + }, + "activity": { + "thinking": "Думает…", + "fetching": "Загружает {domain}, {window}…", + "digestOne": "Обобщает {count} измерение…", + "digestFew": "Обобщает измерения ({count})…", + "digestOther": "Обобщает измерения ({count})…", + "digestDoneOne": "{count} измерение из {areas}", + "digestDoneFew": "Измерений из {areas}: {count}", + "digestDoneOther": "Измерений из {areas}: {count}", + "areasOne": "{count} область", + "areasFew": "Областей: {count}", + "areasOther": "Областей: {count}", + "memoryOne": "Помнит {count} вещь, которую вы ему рассказали", + "memoryFew": "Помнит вещей, которые вы ему рассказали: {count}", + "memoryOther": "Помнит вещей, которые вы ему рассказали: {count}", + "remember": "Запоминает…", + "plan": "Составляет план…", + "asking": "Спрашивает вас…", + "answer": "Пишет ответ…", + "stop": { + "budget": "Достигнут лимит бюджета, отвечает тем, что есть", + "time": "Достигнут лимит времени, отвечает тем, что есть", + "cap": "Много шагов, завершает", + "noProgress": "Нет новых данных, завершает" + }, + "thoughtProcessOne": "Ход мыслей ({count} шаг)", + "thoughtProcessFew": "Ход мыслей (шагов: {count})", + "thoughtProcessOther": "Ход мыслей (шагов: {count})", + "awaitingAnswer": "Нужен ответ" + }, + "memory": { + "saved": "Запомнено: {fact}", + "undo": "Отменить", + "accept": "Да, запомни это", + "decline": "Нет", + "confirmed": "Понял, запомню.", + "declined": "Хорошо, не буду." + }, + "plan": { + "accept": "Взять этот план", + "decline": "Не сейчас", + "confirmed": "Записал. Напомню о себе через {days} дн.", + "declined": "Хорошо, не сейчас." + }, + "assumption": { + "line": "Предположено: {value}", + "change": "Изменить" + }, + "suggestedReplies": { + "groupLabel": "Предлагаемые ответы" + }, + "chart": { + "compare": { + "periods": "{a} против {b}" + } + }, + "reasoning": { + "label": "Глубина размышления", + "hint": "Более глубокое размышление даёт более точные ответы и немного больше ожидания.", + "off": "Выкл.", + "minimal": "Минимальная", + "low": "Низкая", + "medium": "Средняя", + "high": "Высокая", + "capped": "(ограничено администратором)", + "disabled": "Администратор отключил глубокое размышление." + }, + "memoryLink": "Память ({count})", + "newConversation": "Новый разговор" + }, + "relativeJustNow": "только что", + "relativeMinutesAgoOne": "{count} минуту назад", + "relativeMinutesAgoOther": "{count} минут назад", + "relativeMinutesAgoFew": "{count} минуты назад", + "relativeHoursAgoOne": "{count} час назад", + "relativeHoursAgoOther": "{count} часов назад", + "relativeHoursAgoFew": "{count} часа назад", + "relativeDaysAgoOne": "{count} день назад", + "relativeDaysAgoOther": "{count} дней назад", + "relativeDaysAgoFew": "{count} дня назад", + "navOverview": "Обзор", + "navCatalog": "Все показатели", + "navBloodPressure": "АД", + "navWeight": "Вес", + "navPulse": "Пульс", + "navMood": "Настроение", + "navMedication": "Лекарства", + "navNutrients": "Нутриенты", + "navBmi": "ИМТ", + "navSleep": "Сон", + "navHrv": "HRV", + "navRestingHr": "ЧСС в покое", + "navOxygenSaturation": "Кислород", + "navBodyTemperature": "Температура", + "navSteps": "Шаги", + "navActiveEnergy": "Активная энергия", + "navAriaLabel": "Перейти к разделу", + "pillScrollLeft": "Прокрутить вкладки влево", + "pillScrollRight": "Прокрутить вкладки вправо", + "tabStrip": { + "vitalsParent": { + "label": "Показатели", + "header": "Показатели жизнедеятельности" + }, + "bodyParent": { + "label": "Тело", + "header": "Состав тела" + }, + "activityParent": { + "label": "Активность", + "header": "Активность и подвижность" + }, + "heartParent": { + "label": "Сердце", + "header": "Здоровье сердца" + }, + "hearingParent": { + "label": "Слух", + "header": "Слух и звуковое воздействие" + }, + "environmentParent": { + "label": "Среда", + "header": "Среда" + }, + "metabolicParent": { + "label": "Метаболизм", + "header": "Метаболизм" + } + }, + "hrv": { + "title": "HRV", + "description": "Вариабельность сердечного ритма в динамике: сигнал восстановления вашей нервной системы, который Apple Watch и другие совместимые носимые устройства фиксируют во время сна.", + "chartTitle": "Вариабельность сердечного ритма", + "emptyState": { + "title": "Пока нет данных HRV", + "description": "Данные HRV появятся здесь, как только Apple Watch (или совместимое устройство Withings) начнёт синхронизировать ночные измерения." + } + }, + "restingHr": { + "title": "ЧСС в покое", + "description": "Ежедневный минимум, к которому приходит ваше сердце, в отличие от разовых измерений пульса на странице пульса. Apple Health передаёт одно значение в день.", + "chartTitle": "ЧСС в покое", + "emptyState": { + "title": "Пока нет ЧСС в покое", + "description": "ЧСС в покое появится, когда Apple Watch или совместимое устройство Withings проработает один спокойный день." + }, + "coachPrefill": "Я ещё не записывал ЧСС в покое. Почему ежедневное значение в покое отличается от разового пульса и как его улучшить?" + }, + "oxygenSaturation": { + "title": "Насыщение кислородом", + "description": "Кислород в крови (SpO₂): клиническая норма 95–100 %, целевые зоны выделены на графике.", + "chartTitle": "Насыщение кислородом", + "emptyState": { + "title": "Пока нет данных SpO₂", + "description": "Данные SpO₂ появятся здесь, как только совместимое носимое устройство (Apple Watch, Withings ScanWatch) сделает измерение." + } + }, + "bodyTemperature": { + "title": "Температура тела", + "description": "Динамика температуры тела в градусах Цельсия. Измерения температуры кожи от Withings относятся к отдельному показателю.", + "chartTitle": "Температура тела", + "emptyState": { + "title": "Пока нет температуры тела", + "description": "Запишите температуру тела или дайте носимо­му устройству синхронизировать её, и динамика появится здесь.", + "cta": "Записать температуру тела" + } + }, + "steps": { + "title": "Шаги", + "description": "Ежедневное число шагов, одна строка в день, из Apple Health или подключённого устройства активности.", + "chartTitle": "Шаги в день", + "emptyState": { + "title": "Пока нет данных о шагах", + "description": "Ежедневные итоги шагов появятся здесь, как только Apple Health или устройство активности синхронизирует день движения." + } + }, + "activeEnergy": { + "title": "Активная энергия", + "description": "Ежедневный итог активной энергии в килокалориях, одна строка в день, из Apple Health или активности Withings.", + "chartTitle": "Активная энергия", + "emptyState": { + "title": "Пока нет данных об активной энергии", + "description": "Итоги активной энергии появятся здесь, как только Apple Health или устройство активности Withings синхронизирует день движения." + } + }, + "subPage": { + "loadError": "Не удалось загрузить этот показатель прямо сейчас.", + "blutdruckDescription": "Динамика систолического и диастолического АД с целевыми зонами, персонализированными по возрасту, и письменной оценкой.", + "gewichtDescription": "Динамика веса в сопоставлении со здоровым диапазоном, рассчитанным по вашему росту, и письменной оценкой.", + "pulsDescription": "Пульс в покое в сопоставлении с референсным диапазоном по возрасту и полу на основе процентилей населения CDC/NCHS и письменной оценкой.", + "stimmungDescription": "Ежедневные оценки настроения в динамике с письменной оценкой.", + "medikamenteDescription": "Календари приверженности по каждому лекарству и письменная оценка.", + "bmiDescription": "ИМТ, рассчитанный по вашему весу и росту, с письменной оценкой.", + "target": { + "adjustLink": "Изменить целевой диапазон" + }, + "explainer": { + "bloodPressureBody": "Артериальное давление — это сила, с которой кровь давит на стенки артерий; записывается как систолическое над диастолическим (пик во время сокращения сердца над значением в покое между ударами). Постоянно повышенные значения со временем нагружают сердце и сосуды.", + "pulseBody": "Пульс — это число ударов сердца в минуту. Разовое измерение отражает то, что вы делали в этот момент. В покое он обычно составляет 60–100 ударов в минуту и естественно повышается при движении, стрессе или кофеине.", + "weightBody": "Вес тела — один из простейших сигналов долгосрочного энергетического баланса и общего здоровья. Динамика за недели значит гораздо больше, чем любое отдельное измерение, которое колеблется из-за гидратации, еды и времени суток.", + "bmiBody": "ИМТ — это ваш вес, делённый на квадрат роста; он даёт одно число, которое относит вас к широкой весовой категории. Это популяционный скрининг, а не диагноз, и он не отличает мышцы от жира.", + "sleepBody": "Продолжительность сна — это то, сколько вы фактически спали за ночь, с разделением на лёгкую, глубокую и REM-фазы. Большинству взрослых нужно примерно от семи до девяти часов; и стабильное количество, и качество поддерживают восстановление, настроение и обмен веществ.", + "moodBody": "Отслеживание настроения фиксирует, как вы себя чувствуете со временем, по простой шкале. Регулярные записи выявляют закономерности (как сон, активность или лекарства соотносятся с вашим самочувствием), которых не покажет ни один отдельный день.", + "medicationsBody": "Приверженность — это то, насколько надёжно вы принимаете лекарство по назначению; здесь она показана как доля ожидаемых доз, которые вы фактически записали. Именно стабильный приём часто позволяет лечению работать так, как задумано.", + "restingHrBody": "ЧСС в покое — это ваш пульс, когда вы полностью отдыхаете, обычно измеряется ночью, в отличие от пульса во время активности. Более низкая ЧСС в покое, как правило, указывает на лучшую сердечно-сосудистую форму, а растущая динамика может быть ранним признаком стресса или заболевания. Как общее ориентировочное значение, нормальная ЧСС в покое у взрослого составляет 60–100 ударов в минуту (AHA 2024); тренированное сердце может безобидно держаться на 40–60.", + "hrvBody": "HRV — это крошечная разница во времени между последовательными ударами сердца. Более высокая вариабельность обычно отражает хорошо восстановленную, адаптивную нервную систему, а устойчивое снижение может сигнализировать об усталости, стрессе или недостаточном восстановлении.", + "oxygenSaturationBody": "SpO₂ — это процент ваших эритроцитов, переносящих кислород. Значения 95–100 % в покое нормальны; значения, которые держатся ниже 90 %, заслуживают внимания, хотя кратковременные ночные снижения обычны.", + "bodyTemperatureBody": "Температура тела отражает ваше внутреннее тепловое состояние. Как общее ориентировочное значение, среднее по населению составляет около 36,6 °C (а не 37,0 °C), нормальный оральный диапазон — примерно 35,7–37,4 °C, а лихорадка — от 38,0 °C (J Gen Intern Med 2019). В течение дня она колеблется примерно на 0,5 °C, а разные места измерения различаются до ~1 °C, поэтому отмечайте, где вы измеряли. Ночные измерения на запястье отражают относительное изменение, а не клиническое значение лихорадки.", + "activeEnergyBody": "Активная энергия — это калории, которые вы сжигаете за счёт движения, сверх базового уровня, который тело использует в покое. Это прямое измерение того, насколько физически активным был ваш день.", + "workoutsBody": "Тренировки — это структурированные занятия, которые записывают ваши устройства, с типом, длительностью и энергией. Их отслеживание показывает, как регулярные тренировки накапливаются за недели и как они связаны с другими вашими сигналами здоровья.", + "respiratoryRateBody": "Частота дыхания — это число вдохов в минуту. Как общее ориентировочное значение, в покое большинство взрослых дышат 12–20 раз в минуту (American Lung Association); это значимо только действительно в покое или во сне. Устойчивый рост примерно на +3 относительно вашего собственного ночного базового уровня может быть ранним сигналом заболевания; клинические пороги для эскалации — это инструменты больниц, а не самодиагностики.", + "bodyWaterBody": "Общая вода в организме — это доля веса вашего тела, состоящая из жидкости внутри и вокруг клеток. Она меняется с гидратацией, едой и активностью, поэтому динамика за недели говорит больше, чем любое отдельное измерение.", + "boneMassBody": "Костная масса — это оценочный вес минералов в вашем скелете. Оценки на основе весов приблизительны, но стабильная или растущая динамика поддерживает долгосрочную прочность костей.", + "fatFreeMassBody": "Обезжиренная масса — это всё в вашем теле, что не является жиром: мышцы, кости, органы и вода. Сохранение или наращивание её при снижении веса обычно указывает на более здоровый состав тела.", + "fatMassBody": "Жировая масса — это общий вес жира в вашем теле. Часть жира необходима для гормонов и запасания энергии, но слишком много, особенно вокруг живота, повышает долгосрочный риск для здоровья (WHO 2024).", + "bodyFatBody": "Процент жировой массы — это доля вашего веса, приходящаяся на жир. Здоровые диапазоны зависят от пола и возраста, а домашние весы оценивают его по биоимпедансу, поэтому динамика за несколько недель говорит больше, чем отдельное измерение.", + "muscleMassBody": "Мышечная масса — это оценочный вес мышц в вашем теле. Больше мышц поддерживает силу, обмен веществ и подвижность, и с возрастом для их сохранения обычно нужны активные усилия.", + "visceralFatBody": "Висцеральный жир — это жир, отложенный глубоко в животе вокруг органов. В отличие от жира под кожей, высокий уровень тесно связан с болезнями сердца и диабетом 2-го типа, поэтому чем ниже, тем обычно лучше.", + "leanBodyMassBody": "Тощая масса тела — это ваш общий вес минус жировая масса: мышцы, кости, органы и вода вместе. Отслеживание её вместе с весом показывает, происходят ли изменения за счёт мышц или жира.", + "flightsClimbedBody": "Этажи, пройденные вверх, считают этажи, на которые вы поднимаетесь каждый день, причём один этаж — это примерно десять футов подъёма. Это простой маркер попутной активности и нагрузки на нижнюю часть тела.", + "walkingDistanceBody": "Расстояние ходьбы и бега — это путь, который вы проходите пешком каждый день. Оно дополняет число шагов, отражая, как далеко вы переместились, а не только как часто шагали.", + "walkingSteadinessBody": "Устойчивость ходьбы оценивает, насколько стабильна и уравновешена ваша походка, с градацией от «в норме» до «низкая». Более низкий уровень указывает на повышенную вероятность падения, и это стоит обсудить с врачом.", + "walkingHeartRateBody": "ЧСС при ходьбе — это ваш средний пульс во время ровной прогулки. Более низкая ЧСС при ходьбе со временем часто отражает улучшение сердечно-сосудистой формы при той же нагрузке.", + "walkingAsymmetryBody": "Асимметрия ходьбы — это доля времени, когда ваши шаги неравномерны между левой и правой ногой. Более высокий процент может указывать на боль, травму или проблему с походкой, которую стоит проверить.", + "doubleSupportTimeBody": "Время двойной опоры — это доля каждого шагового цикла, когда обе стопы одновременно касаются земли. Более высокий процент обычно означает более осторожную, менее устойчивую походку.", + "stepLengthBody": "Длина шага — это среднее расстояние от одного шага до следующего. Более короткий шаг со временем может отражать усталость, осторожность или изменение подвижности.", + "walkingSpeedBody": "Скорость ходьбы — это то, как быстро вы движетесь при ровной ходьбе. Это хорошо изученный маркер общего здоровья и подвижности, и стабильный или растущий темп — хороший знак.", + "pulseWaveVelocityBody": "Скорость пульсовой волны измеряет, как быстро волна давления от каждого удара сердца распространяется по вашим артериям. Более быстрая волна указывает на более жёсткие артерии, что связано с более высоким сердечно-сосудистым риском. Как общее ориентировочное значение, европейские клинические рекомендации отмечают каротидно-феморальную скорость выше 10 м/с (ESC/ESH 2018), но потребительская оценка — это приближение, не взаимозаменяемое с этим клиническим измерением.", + "vascularAgeBody": "Сосудистый возраст оценивает, насколько стары ваши артерии по сравнению с вашим фактическим возрастом, на основе жёсткости артерий. Сосудистый возраст ниже вашего реального возраста говорит о более здоровых сосудах.", + "environmentalAudioBody": "Уровни окружающего шума отслеживают громкость мира вокруг вас в децибелах. Длительное воздействие выше примерно 70 дБ со временем может повредить слух, поэтому более низкие среднесуточные значения безопаснее.", + "headphoneAudioBody": "Уровни звука в наушниках отслеживают, насколько громко вы слушаете через вкладыши или наушники, в децибелах. Снижение громкости и перерывы защищают ваш слух в долгосрочной перспективе.", + "audioEventsBody": "События громкого звука отмечают моменты, когда шум вокруг вас достиг уровня, способного при достаточном воздействии повредить слух. Частые события — повод искать более тихое окружение или защиту слуха.", + "daylightBody": "Время на дневном свете — это то, сколько вы проводите на улице при свете каждый день. Регулярный дневной свет поддерживает здоровый ритм сна и бодрствования и настроение (CDC 2024), а время на улице связано со здоровьем глаз.", + "bloodGlucoseBody": "Глюкоза крови — это количество сахара в вашей крови, основного источника энергии организма. Она повышается после еды и стабилизируется между приёмами пищи. Как общее ориентировочное значение для взрослых без диабета, значение натощак ниже {prediabetesFrom} {unit} — норма, {prediabetesFrom}–{prediabetesTo} — преддиабет, а {diabetesFrom} и выше попадает в диапазон диабета (ADA 2024). Одно высокое значение не ставит диагноз; врач подтверждает повторным тестом, а люди с диабетом используют другие цели, установленные врачом.", + "skinTemperatureBody": "Температура кожи здесь — это небольшое ночное изменение температуры вашего запястья относительно вашего собственного базового уровня, а не абсолютное значение лихорадки. Сдвиги могут отражать сон, среду, заболевание или фазу менструального цикла.", + "cardioFitnessBody": "VO₂ max — это сколько кислорода ваше тело может использовать при пиковой нагрузке, лучший лабораторный показатель аэробной формы, который носимые устройства оценивают косвенно. Более высокий или растущий тренд — сильный признак сердечно-сосудистого здоровья.", + "cardioRecoveryBody": "Кардиовосстановление — это на сколько ударов в минуту падает ваш пульс в первую минуту после прекращения интенсивной нагрузки. Большее падение означает, что сердце успокаивается быстрее, что является признаком хорошей формы.", + "wristTemperatureBody": "Температура запястья измеряется во время сна и передаётся как разница с вашим личным базовым уровнем, а не как абсолютное значение. Стабильное значение нормально, а устойчивый рост может указывать на заболевание, интенсивные тренировки или изменение менструального цикла.", + "fallsBody": "Здесь считается число сильных падений, которые обнаруживает ваше носимое устройство. Цель — ноль; растущее число — сигнал риска для подвижности, который стоит обсудить с врачом, особенно для пожилых людей (CDC STEADI 2024).", + "sixMinuteWalkBody": "Это оценка того, как далеко вы могли бы пройти за шесть минут, — давний клинический тест подвижности и кардиопульмональной выносливости. Значение с носимого устройства — это приближение, а не клинический тест под наблюдением; полезно читать стабильную или растущую динамику.", + "stairAscentSpeedBody": "Это то, как быстро вы поднимаетесь по лестничному пролёту. Это чувствительный маркер силы ног и подвижности. Стабильный или растущий темп — хороший знак, а падающий стоит отслеживать.", + "stairDescentSpeedBody": "Это то, как быстро вы спускаетесь по лестничному пролёту. Вместе со скоростью подъёма он отражает контроль ног и равновесие. Стабильный темп — хороший знак, а падающий стоит отслеживать.", + "breathingDisturbancesBody": "Носимое устройство может оценить, как часто ваше дыхание прерывалось во время сна. Чем ниже индекс, тем лучше; уровень, отмеченный как повышенный, особенно на протяжении многих ночей, стоит обсудить с врачом. Это скрининговое приближение, а не диагноз апноэ сна.", + "stepsBody": "Число шагов — это общее количество шагов, которые вы делаете каждый день, простейшее измерение повседневного движения. Стабильная привычка важнее любого отдельного большого дня, а круглая цель в 10 000 — маркетинговый слоган, а не исследование.", + "readinessBody": "Готовность — это единая ежедневная оценка того, насколько ваше тело готово к дню, объединяющая ЧСС в покое, вариабельность сердечного ритма и сон. Это приближение устройства, сопоставленное с вашим собственным базовым уровнем, а не клиническое измерение. Более высокий балл означает восстановление, более низкий — мягкий сигнал сбавить темп.", + "sleepScoreBody": "Ваш балл сна сводит целую ночь в одно число: продолжительность, эффективность, регулярность и баланс лёгкой, глубокой и REM-фаз. Следите за картиной на протяжении недель, а не гонитесь за идеальным баллом в какую-то одну ночь.", + "recoveryBody": "Восстановление отражает, насколько хорошо ваше тело пришло в себя, опираясь на ночные сигналы, такие как вариабельность сердечного ритма и ЧСС в покое. Это производное от устройства приближение, читаемое относительно вашего собственного базового уровня, а не клиническое измерение, и оно несопоставимо между устройствами. Высокий балл — зелёный свет, чтобы нагружаться; более мягкий говорит о том, что ваша система ещё восстанавливается.", + "strainBody": "Напряжение отражает, какую сердечно-сосудистую и физическую нагрузку вы дали телу — от тренировок до активного дня на ногах. Это производный от устройства индекс, оцениваемый относительно ваших собственных типичных усилий, а не клиническое измерение, и его главное число несопоставимо между устройствами.", + "stressBody": "Стресс здесь — это эвристика устройства, выведенная из паттернов вариабельности сердечного ритма, а не измерение кортизола или то, как вы осознанно себя чувствуете, и не клинический балл стресса. Читайте его относительно вашего собственного базового уровня; он несопоставим между устройствами. Более низкий балл указывает на спокойное, хорошо отрегулированное состояние; более высокий — приглашение заложить восстановление.", + "recoveryPageBody": "Восстановление объединяет ночные сигналы, которые записывает ваше носимое устройство (подзарядка, напряжение, нагрузка и дневные итоги пульса и энергии), чтобы показать, насколько хорошо ваше тело пришло в себя. Читайте картину по дням, а не какое-то одно число; более мягкое значение — приглашение сбавить темп, а не тревога.", + "pulsePressureBody": "Пульсовое давление — это разница между систолическим и диастолическим значениями (систолическое минус диастолическое). Как общее ориентировочное значение, в покое типично около 40 мм рт. ст.; широкий разрыв выше примерно 60 мм рт. ст. в среднем возрасте может отражать уплотнение артерий, а узкий разрыв ниже примерно 25 мм рт. ст. может сопровождать низкий ударный объём (StatPearls/NIH 2023). Это повод для обсуждения, а не диагноз.", + "meanArterialPressureBody": "Среднее артериальное давление — это среднее давление, которое ваши органы испытывают за один удар сердца, примерно диастолическое плюс треть разрыва до систолического. Как общее ориентировочное значение, значение в покое составляет около 70–100 мм рт. ст. (StatPearls/NIH 2023). Часто цитируемый порог ~60 мм рт. ст. — это концепция интенсивной терапии, а не самодиагностики.", + "cycleEducationBody": "Ваш цикл проходит через четыре фазы, движимые меняющимися гормонами, и его длина и регулярность — доступное окно в общее здоровье. Как общее ориентировочное значение, у взрослых циклы обычно длятся 21–35 дней (клинические источники приводят 24–38), с кровотечением около пяти дней (ACOG 2015). Лютеиновая фаза — это устойчивый якорь, поэтому овуляцию лучше всего оценивать, отсчитывая назад от следующей ожидаемой менструации, а не от фиксированного «14-го дня». Прогнозируемое фертильное окно — это оценка, требующая нескольких записанных циклов, и она остаётся приблизительной, а базальная температура тела подтверждает овуляцию постфактум, а не предсказывает её. Это не метод контрацепции.", + "sleepHygieneBody": "Несколько основанных на доказательствах привычек поддерживают сон: поддерживайте постоянное время отхода ко сну и пробуждения, включая выходные, получайте яркий утренний дневной свет и приглушайте свет вечером, держите комнату прохладной, тёмной и тихой, избегайте кофеина во второй половине дня, позднего алкоголя и больших поздних приёмов пищи (CDC 2024). Регулярность предсказывает здоровье по меньшей мере так же сильно, как продолжительность, а общее время сна с носимого устройства гораздо надёжнее, чем его разделение на глубокую, лёгкую и REM-фазы." + }, + "bpDerived": { + "pulsePressure": "Пульсовое давление (разрыв между вашими значениями) составляет около {value} мм рт. ст.; в покое типично примерно 40.", + "meanArterialPressure": "Среднее артериальное давление (среднее, которое испытывают ваши органы) составляет около {value} мм рт. ст., в норме около 70–100.", + "caveat": "Это выведено из вашего последнего измерения как общее ориентировочное значение, а не диагноз." + }, + "stats": { + "label": "Сводная статистика", + "min": "Мин.", + "max": "Макс.", + "median": "Медиана", + "mean": "Среднее" + }, + "showAllValues": "Показать все измерения", + "valuesPageTitle": "{metric}: все измерения", + "valuesPageDescription": "Каждое измерение за этим показателем. Изменяйте или удаляйте запись прямо здесь.", + "diversity": { + "trigger": "Совет по измерению", + "weekday": "Большинство ваших измерений {metric} приходятся на один день недели. Записи в другие дни дают более полную картину.", + "timeOfDay": "Большинство ваших измерений {metric} приходятся на похожее время суток. Разные часы дают более полную картину." + }, + "valuesBack": "Назад к аналитике", + "valuesBackToMetric": "Назад к {metric}", + "scoresBack": "Назад к аналитике", + "ecgDescription": "Записи ЭКГ с одним отведением с вашего устройства, каждая с собственным результатом устройства." + }, + "units": { + "steps": "шаги", + "flights": "этажи", + "falls": "падения", + "years": "лет", + "breathingEvents": "события", + "standHours": "часы", + "respiratoryRate": "вдохов/мин" + }, + "sleep": { + "title": "Сон", + "description": "Разбивка по фазам и ночная продолжительность из Apple Health.", + "mainSleep": "Основной сон", + "totalSleep": "Общий сон", + "compositionTitle": "Состав фаз", + "compositionSubtitle": "Последние {nights} ночей", + "compositionAriaLabel": "Состав фаз сна за {nights} ночей", + "sourceDiscrepancy": { + "tooltipTitle": "Источники расходятся" + }, + "stages": { + "deep": "Глубокая", + "rem": "REM", + "core": "Базовая", + "asleep": "Сон", + "awake": "Бодрствование", + "inBed": "В постели", + "nap": "Дневной сон", + "napCount": "Дневной сон: {count}", + "unavailable": "Пока нет данных о фазах. Фазы сна появятся здесь, как только подключённый источник их передаст." + }, + "empty": { + "title": "Пока нет данных о сне", + "description": "Подключите источник, например Apple Health или носимое устройство, или записывайте сон вручную, и этот вид заполнится автоматически.", + "action": "Управление устройствами" + }, + "debt": { + "title": "Дефицит сна", + "value": "не хватает {hours} ч {minutes} мин", + "caption": "Непогашенный баланс за последние {nights} ночей", + "clearValue": "Всё восполнено", + "clearCaption": "За последние {nights} ночей ничего не осталось", + "learning": "Ещё изучаем ваш сон: пока {counted} ночей, нужно ещё {remaining}, чтобы прочитать надёжный баланс.", + "computedInfo": "Это собственная оценка HealthLog: скользящий баланс потребности минус сон за последние ночи, который погашается досыпанием. Она может отличаться от собственного показателя дефицита сна носимого устройства, которое использует свою модель потребности." + }, + "average": { + "title": "В среднем за ночь", + "value": "{hours} ч {minutes} мин", + "caption": "Средний сон за последние {nights} ночей", + "learning": "Ещё изучаем ваш сон: пока {counted} ночей, нужно ещё {remaining} для надёжного среднего." + }, + "chronotype": { + "title": "Хронотип", + "learning": "Ещё изучаем ваш ритм: {counted} из {total} свободных ночей. Хронотипу нужно несколько утр без будильника, прежде чем он что-то значит.", + "advancedToggle": "Дополнительно", + "socialJetlagValue": "Социальный джетлаг {hours} ч {minutes} мин", + "socialJetlagCaption": "Разрыв между временем сна в рабочие и свободные дни, как небольшой еженедельный сдвиг часового пояса.", + "msfScValue": "Скорректированная середина сна {clock}", + "msfScCaption": "С поправкой на сон, который вы добираете на выходных (MSFsc).", + "dayTypeNote": "Свободные дни считаются выходными, пока не добавлено отслеживание типа дня.", + "band": { + "extreme_early": "Выраженный утренний тип", + "early": "Утренний тип", + "intermediate": "Промежуточный тип", + "late": "Вечерний тип", + "extreme_late": "Выраженный вечерний тип" + }, + "midpointHeadline": "Середина вашего естественного сна — около {clock}." + }, + "rhythm": { + "loadError": "Ваш ритм сна не удалось загрузить только что. Он появится снова, когда подключение стабилизируется." + } + }, + "medicationCompliance": "Приверженность лечению", + "dayStreak": "{count} дн. подряд", + "dayStreakOne": "{count} дн. подряд", + "compliance7d": "Приверженность (7 дней)", + "compliance30d": "Приверженность (30 дней)", + "taken": "принято", + "skipped": "пропущено", + "missed": "пропущено", + "assessmentTitle": "Оценка", + "restMode": { + "title": "Режим отдыха", + "body": "Активен эпизод заболевания или состояния, поэтому это отражает период восстановления. Ваш балл из-за этого не снижается.", + "bodySince": "Эпизод заболевания или состояния активен с {since}, поэтому это отражает период восстановления. Ваш балл из-за этого не снижается." + }, + "bloodPressureSectionTitle": "АД", + "weightSectionTitle": "Вес", + "pulseSectionTitle": "Пульс", + "bmiSectionTitle": "ИМТ", + "complianceNoData": "Нет данных о приверженности.", + "generate": "Создать новый анализ", + "moodSectionTitle": "Настроение", + "emptyState": { + "bloodPressure": { + "title": "Пока нет записей АД", + "description": "Запишите измерение АД, и здесь появятся график динамики, доля значений в диапазоне и классификация ВОЗ.", + "cta": "Записать АД" + }, + "weight": { + "title": "Пока нет записей веса", + "description": "Запишите вес, и динамика, скользящее среднее и целевой диапазон появятся автоматически.", + "cta": "Записать вес" + }, + "pulse": { + "title": "Пока нет записей пульса", + "description": "Запишите измерение пульса, и в этом виде появятся пульс в покое, HRV и VO₂ max.", + "cta": "Записать пульс" + }, + "bmi": { + "title": "ИМТ ещё не рассчитан", + "description": "Как только появятся рост и хотя бы одна запись веса, здесь появится динамика ИМТ с зонами ВОЗ.", + "cta": "Записать вес" + }, + "mood": { + "title": "Пока нет записей настроения", + "description": "Запишите настроение, и появятся динамика, диапазон стабильности и корреляции.", + "cta": "Записать настроение" + }, + "medication": { + "title": "Пока не настроено ни одного лекарства", + "description": "Настройте лекарство, и здесь появятся приверженность, уровень препарата и хронология титрации.", + "cta": "Добавить лекарство" + }, + "sleep": { + "title": "Пока нет записей сна", + "description": "Как только появятся данные о сне (вручную или через Withings / Apple Health), здесь появится разбивка по фазам за каждую ночь.", + "cta": "Подключить источник" + } + }, + "navWorkouts": "Тренировки", + "navRecovery": "Восстановление", + "workouts": { + "title": "Тренировки", + "description": "Недавние пробежки, поездки на велосипеде, прогулки и силовые занятия, без дублей между источниками Apple Watch и Withings.", + "emptyState": { + "title": "Пока нет тренировок", + "description": "Тренировки синхронизируются из Apple Health на вашем iPhone и из Withings. Вы также можете записать одну вручную." + }, + "detail": { + "backToList": "Назад к тренировкам", + "statsTitle": "Статистика", + "statsDuration": "Длительность", + "statsDistance": "Расстояние", + "statsActiveEnergy": "Активная энергия", + "statsAvgHr": "Средняя ЧСС", + "statsMaxHr": "Макс. ЧСС", + "statsMinHr": "Мин. ЧСС", + "statsStepCount": "Шаги", + "statsElevation": "Набор высоты", + "statsPace": "Темп", + "routeTitle": "Маршрут", + "hrChartTitle": "ЧСС", + "notFound": "Тренировка не найдена.", + "hrFromPulse": "По данным вашей ЧСС вокруг этой тренировки", + "hrAxisMinutes": "мин", + "hrAvgMarker": "Средняя {bpm}", + "hrMaxMarker": "Пик {bpm}", + "hrRangeValue": "{low}–{high} уд/мин", + "hrRangeLabel": "Диапазон", + "hrNoProfile": "Нет данных ЧСС по отдельным измерениям, покрывающих эту тренировку.", + "sportAverageLabel": "Ваше недавнее среднее:", + "zonesTitle": "Зоны усилия", + "zonesCaption": "Как ваше усилие распределилось по зонам ЧСС.", + "zonesCaptionDevice": "Время в зоне по данным вашего устройства.", + "exportGpx": "Экспорт GPX", + "elevationTitle": "Набор высоты", + "splitsTitle": "Отрезки", + "splitsKm": "км", + "splitsTime": "Время", + "splitsPace": "Темп", + "thatDayTitle": "В тот день", + "daySleepTitle": "Ночь перед этим", + "daySleepNone": "За ту ночь сон не записан", + "daySleepAwakeningsOne": "{count} пробуждение", + "daySleepAwakeningsMany": "Пробуждений: {count}", + "dayMoodTitle": "Настроение в тот день", + "dayMoodNone": "В тот день настроение не записано", + "sleepTrendsLink": "Динамика сна", + "moodHistoryLink": "История настроения", + "previousSessionLink": "Предыдущая тренировка", + "insightTitle": "Вывод об активности" + }, + "sport": { + "walking": "Ходьба", + "running": "Бег", + "cycling": "Велосипед", + "hiking": "Поход", + "swimming": "Плавание", + "rowing": "Гребля", + "elliptical": "Эллиптический тренажёр", + "stairClimber": "Степпер", + "yoga": "Йога", + "mindAndBody": "Разум и тело", + "strength": "Силовая", + "hiit": "HIIT", + "dance": "Танцы", + "golf": "Гольф", + "badminton": "Бадминтон", + "tennis": "Теннис", + "basketball": "Баскетбол", + "soccer": "Футбол", + "crossTraining": "Кросс-тренинг", + "mixedCardio": "Смешанное кардио", + "other": "Другое" + }, + "loadError": "Ваши тренировки не удалось загрузить", + "loadMore": "Загрузить больше тренировок", + "loadingMore": "Загрузка тренировок", + "loadMoreError": "Не удалось загрузить больше тренировок", + "countOne": "{count} тренировка", + "countOther": "Тренировок: {count}", + "countFew": "Тренировок: {count}", + "filterLabel": "Фильтр по виду спорта", + "filterAll": "Все виды спорта", + "filterEmpty": "В вашей истории нет занятий этого вида спорта.", + "manual": { + "logWorkout": "Записать тренировку", + "sheetTitle": "Записать тренировку", + "sheetDescription": "Введите занятие вручную: что вы делали, когда и как долго.", + "sportLabel": "Активность", + "sportPlaceholder": "Выберите активность", + "startLabel": "Начало", + "startHint": "Оставьте пустым, если вы только что закончили: оно отсчитывается назад от текущего момента на длительность.", + "durationLabel": "Длительность", + "distanceLabel": "Расстояние ({unit})", + "energyLabel": "Активная энергия (ккал)", + "alreadySaved": "Эта тренировка уже сохранена", + "saveError": "Тренировку не удалось сохранить", + "deleteLabel": "Удалить тренировку", + "deleteConfirmTitle": "Удалить эту тренировку?", + "deleteConfirmDescription": "Эта тренировка, введённая вручную, будет удалена навсегда.", + "deleted": "Тренировка удалена", + "deleteError": "Тренировку не удалось удалить", + "errors": { + "sportRequired": "Выберите активность.", + "startRequired": "Введите дату и время.", + "startInFuture": "Начало не может быть в будущем.", + "durationRequired": "Введите, сколько длилась тренировка.", + "durationInvalid": "Введите целые часы и минуты от 0 до 59.", + "durationTooLong": "Тренировка может длиться не более 24 часов.", + "endInFuture": "Она закончилась бы в будущем. Укажите начало, когда тренировка началась.", + "distanceInvalid": "Введите расстояние числом в реалистичном диапазоне.", + "energyInvalid": "Введите активную энергию числом до 20 000 ккал." + }, + "editTitle": "Изменить тренировку", + "editAction": "Изменить", + "updated": "Тренировка обновлена" + }, + "load": { + "title": "Тренировочная нагрузка", + "fitness": "Форма", + "fatigue": "Усталость", + "form": "Баланс", + "explainer": "Форма — это ваш тренировочный импульс по ЧСС, усреднённый примерно за шесть недель, усталость — примерно за одну неделю, а баланс — их разница. Числа сравниваются с вашим собственным прошлым, а не с другими людьми или другими приложениями.", + "warmingUp": "На основе {days} дней на данный момент: пока не охвачено шесть недель, форма читается ниже, чем есть.", + "coverage": "Оценено {rated} из последних {days} дней. День без данных об активности или с тренировкой, которую не удалось оценить, исключается, а не считается отдыхом.", + "asOf": "По состоянию на {date}, последний день, который удалось оценить." + } + }, + "bloodGlucose": { + "title": "Глюкоза крови", + "description": "Ваши измерения глюкозы крови в динамике, в {unit}.", + "chartTitle": "Глюкоза крови", + "medianLabel": "Медиана глюкозы", + "emptyState": { + "title": "Пока нет данных о глюкозе", + "description": "Измерения глюкозы крови появятся здесь, как только вы запишете одно или синхронизируется подключённое устройство." + }, + "clinical": { + "title": "Обзор глюкозы", + "subtitle": "Оценка за последние {days} дней по {count} измерениям.", + "spotCaveat": "Это оценки по разовым измерениям, а не профиль непрерывного мониторинга. Читайте их как направление движения, а не как клинический вердикт.", + "labsLink": "Результаты анализов? Запишите HbA1c (гликированный гемоглобин) или глюкозу натощак из анализа крови в разделе «Анализы».", + "learningTitle": "Ещё изучаем вашу глюкозу", + "learningBody": "Пока это {count} за {days}. Ещё немного истории, и более полная картина прояснится. Продолжайте записывать или дайте подключённому устройству заполнить её.", + "learningBodyEmpty": "Как только поступит несколько измерений (записанных вами или синхронизированных с устройства), здесь сформируются ваше время в диапазоне, среднее и вариабельность.", + "readingsCount": "Измерений: {count}", + "readingsCountOne": "1 измерение", + "daysCount": "Дней: {days}", + "daysCountOne": "1 день", + "tir": { + "title": "Время в диапазоне", + "caption": "Доля измерений в каждой полосе ({low}–{high} {unit} — цель).", + "veryLow": "Очень низко", + "low": "Низко", + "inRange": "В диапазоне", + "high": "Высоко", + "veryHigh": "Очень высоко", + "ariaLabel": "Время в диапазоне: {tir} % в цели, {below} % ниже, {above} % выше.", + "empty": "Пока нет измерений для графика." + }, + "gmi": { + "label": "Индикатор управления глюкозой", + "help": "Оценка, подобная A1C, выведенная из вашей средней глюкозы." + }, + "eA1c": { + "label": "Расчётный A1C", + "help": "Оценка A1C по вашей средней глюкозе (ADAG)." + }, + "mean": { + "label": "Средняя глюкоза" + }, + "cv": { + "label": "Вариабельность", + "steady": "Стабильно", + "unstable": "Нестабильно", + "help": "Коэффициент вариации. При 36 % и выше глюкоза считается нестабильной; ниже — стабильнее." + }, + "advanced": { + "toggle": "Дополнительные индексы", + "intro": "Композитные показатели исследовательского уровня для более пристального взгляда. Каждый сводит ваши измерения в одно число, взвешенное по риску.", + "jIndex": { + "label": "J-индекс", + "help": "Единый балл, объединяющий ваше среднее и его разброс; ниже — читается как более плотный контроль." + }, + "lbgi": { + "label": "Риск низкой глюкозы (LBGI)", + "help": "Индекс Коватчева, взвешивающий, как часто и как глубоко измерения опускаются низко." + }, + "hbgi": { + "label": "Риск высокой глюкозы (HBGI)", + "help": "Индекс Коватчева, взвешивающий, как часто и как высоко поднимаются измерения." + }, + "byContext": { + "title": "По контексту", + "fasting": "Натощак", + "postprandial": "После еды", + "random": "Случайно", + "bedtime": "Перед сном", + "unspecified": "Без метки", + "readingsShort": "Измерений: {count}", + "readingsShortOne": "1 измерение" + } + } + } + }, + "navBloodGlucose": "Глюкоза", + "totalBodyWater": { + "title": "Общая вода в организме", + "description": "Ваша общая вода в организме в динамике, в килограммах.", + "chartTitle": "Общая вода в организме", + "emptyState": { + "title": "Пока нет данных о воде в организме", + "description": "Измерения воды в организме появятся здесь, как только синхронизируются подключённые весы с анализом состава тела." + } + }, + "navTotalBodyWater": "Вода в организме", + "boneMass": { + "title": "Костная масса", + "description": "Ваша костная масса в динамике, в килограммах.", + "chartTitle": "Костная масса", + "emptyState": { + "title": "Пока нет данных о костной массе", + "description": "Измерения костной массы появятся здесь, как только синхронизируются подключённые весы с анализом состава тела." + } + }, + "navBoneMass": "Костная масса", + "flightsClimbed": { + "title": "Пройдено этажей", + "description": "Этажи лестниц, которые вы прошли каждый день.", + "chartTitle": "Этажи в день", + "emptyState": { + "title": "Пока нет данных об этажах", + "description": "Итоги пройденных этажей появятся здесь, как только Apple Health синхронизирует день движения." + } + }, + "navFlightsClimbed": "Этажи", + "walkingRunningDistance": { + "title": "Расстояние ходьбы и бега", + "description": "Расстояние ходьбы и бега, которое вы прошли каждый день, в километрах.", + "chartTitle": "Расстояние в день", + "emptyState": { + "title": "Пока нет данных о расстоянии", + "description": "Ежедневное расстояние появится здесь, как только Apple Health синхронизирует день движения." + } + }, + "navWalkingRunningDistance": "Расстояние", + "fatFreeMass": { + "title": "Обезжиренная масса", + "description": "Ваша обезжиренная масса в динамике, в килограммах.", + "chartTitle": "Обезжиренная масса", + "emptyState": { + "title": "Пока нет данных об обезжиренной массе", + "description": "Измерения обезжиренной массы появятся здесь, как только синхронизируются подключённые весы с анализом состава тела." + } + }, + "navFatFreeMass": "Обезжиренная масса", + "fatMass": { + "title": "Жировая масса", + "description": "Ваша жировая масса в динамике, в килограммах.", + "chartTitle": "Жировая масса", + "emptyState": { + "title": "Пока нет данных о жировой массе", + "description": "Измерения жировой массы появятся здесь, как только синхронизируются подключённые весы с анализом состава тела." + } + }, + "bodyFat": { + "title": "Жировая масса", + "description": "Ваш процент жировой массы в динамике.", + "chartTitle": "Жировая масса", + "emptyState": { + "title": "Пока нет данных о жировой массе", + "description": "Измерения жировой массы появятся здесь, как только синхронизируются весы с анализом состава тела или когда вы запишете одно вручную.", + "cta": "Записать жировую массу" + } + }, + "navFatMass": "Жировая масса", + "navBodyFat": "Жировая масса", + "muscleMass": { + "title": "Мышечная масса", + "description": "Ваша мышечная масса в динамике, в килограммах.", + "chartTitle": "Мышечная масса", + "emptyState": { + "title": "Пока нет данных о мышечной массе", + "description": "Измерения мышечной массы появятся здесь, как только синхронизируются подключённые весы с анализом состава тела." + } + }, + "navMuscleMass": "Мышечная масса", + "skinTemperature": { + "title": "Температура кожи", + "description": "Температура кожи вашего запястья в динамике, в градусах Цельсия.", + "chartTitle": "Температура кожи", + "emptyState": { + "title": "Пока нет данных о температуре кожи", + "description": "Измерения температуры кожи появятся здесь, как только носимое устройство синхронизирует ночную температуру запястья." + } + }, + "navSkinTemperature": "Темп. кожи", + "pulseWaveVelocity": { + "title": "Скорость пульсовой волны", + "description": "Ваша артериальная скорость пульсовой волны в динамике, в м/с. Более высокие значения указывают на более жёсткие артерии.", + "chartTitle": "Скорость пульсовой волны", + "emptyState": { + "title": "Пока нет данных о скорости пульсовой волны", + "description": "Измерения скорости пульсовой волны появятся здесь, как только синхронизируется совместимое устройство Withings." + } + }, + "navPulseWaveVelocity": "Скорость пульсовой волны", + "vascularAge": { + "title": "Сосудистый возраст", + "description": "Ваш расчётный сосудистый возраст в динамике, в годах.", + "chartTitle": "Сосудистый возраст", + "emptyState": { + "title": "Пока нет данных о сосудистом возрасте", + "description": "Оценки сосудистого возраста появятся здесь, как только синхронизируется совместимое устройство Withings." + } + }, + "navVascularAge": "Сосудистый возраст", + "visceralFat": { + "title": "Висцеральный жир", + "description": "Ваш рейтинг висцерального жира в динамике.", + "chartTitle": "Висцеральный жир", + "emptyState": { + "title": "Пока нет данных о висцеральном жире", + "description": "Рейтинги висцерального жира появятся здесь, как только синхронизируются совместимые весы с анализом состава тела." + } + }, + "navVisceralFat": "Висцеральный жир", + "audioExposureEnv": { + "title": "Окружающий звук", + "description": "Ваше среднесуточное воздействие окружающего шума, в дБА.", + "chartTitle": "Воздействие окружающего шума", + "emptyState": { + "title": "Пока нет данных об окружающем звуке", + "description": "Измерения уровня окружающего шума появятся здесь, как только Apple Health синхронизирует их." + } + }, + "navAudioExposureEnv": "Окружающий звук", + "audioExposureHeadphone": { + "title": "Звук в наушниках", + "description": "Ваше среднесуточное воздействие звука в наушниках, в дБА.", + "chartTitle": "Воздействие звука в наушниках", + "emptyState": { + "title": "Пока нет данных о звуке в наушниках", + "description": "Измерения уровня звука в наушниках появятся здесь, как только Apple Health синхронизирует их." + } + }, + "navAudioExposureHeadphone": "Звук в наушниках", + "timeInDaylight": { + "title": "Время на дневном свете", + "description": "Минуты, проведённые на дневном свете каждый день.", + "chartTitle": "Время на дневном свете в день", + "emptyState": { + "title": "Пока нет данных о дневном свете", + "description": "Итоги времени на дневном свете появятся здесь, как только Apple Health синхронизирует день воздействия." + } + }, + "navTimeInDaylight": "Дневной свет", + "walkingSteadiness": { + "title": "Устойчивость ходьбы", + "description": "Ваша устойчивость ходьбы в динамике, в процентах.", + "chartTitle": "Устойчивость ходьбы", + "emptyState": { + "title": "Пока нет данных об устойчивости ходьбы", + "description": "Измерения устойчивости ходьбы появятся здесь, как только Apple Health синхронизирует их." + } + }, + "navWalkingSteadiness": "Устойчивость ходьбы", + "audioExposureEvent": { + "title": "События громкого звука", + "description": "Дни с событием воздействия громкого окружения.", + "chartTitle": "События громкого окружения в день", + "emptyState": { + "title": "Пока нет данных о громких событиях", + "description": "События громкого окружения появятся здесь, как только Apple Health синхронизирует их." + } + }, + "navAudioExposureEvent": "Громкие события", + "respiratoryRate": { + "title": "Частота дыхания", + "description": "Ваша частота дыхания в динамике, в вдохах в минуту.", + "chartTitle": "Частота дыхания", + "emptyState": { + "title": "Пока нет данных о частоте дыхания", + "description": "Измерения частоты дыхания появятся здесь, как только Apple Health синхронизирует дыхание во сне или на тренировке." + } + }, + "navRespiratoryRate": "Частота дыхания", + "leanBodyMass": { + "title": "Тощая масса тела", + "description": "Ваша тощая масса тела в динамике, в килограммах.", + "chartTitle": "Тощая масса тела", + "emptyState": { + "title": "Пока нет данных о тощей массе тела", + "description": "Измерения тощей массы тела появятся здесь, как только синхронизируются подключённые весы с анализом состава тела." + } + }, + "navLeanBodyMass": "Тощая масса тела", + "walkingHeartRateAverage": { + "title": "ЧСС при ходьбе", + "description": "Ваша средняя ЧСС во время ходьбы, в уд/мин.", + "chartTitle": "Средняя ЧСС при ходьбе", + "emptyState": { + "title": "Пока нет данных о ЧСС при ходьбе", + "description": "Измерения ЧСС при ходьбе появятся здесь, как только Apple Health синхронизирует их." + } + }, + "navWalkingHeartRateAverage": "ЧСС при ходьбе", + "walkingAsymmetry": { + "title": "Асимметрия ходьбы", + "description": "Ваша асимметрия ходьбы в динамике, в процентах.", + "chartTitle": "Асимметрия ходьбы", + "emptyState": { + "title": "Пока нет данных об асимметрии ходьбы", + "description": "Измерения асимметрии ходьбы появятся здесь, как только Apple Health синхронизирует их." + } + }, + "navWalkingAsymmetry": "Асимметрия ходьбы", + "walkingDoubleSupport": { + "title": "Время двойной опоры", + "description": "Процент каждого шага, когда обе стопы находятся на земле.", + "chartTitle": "Время двойной опоры", + "emptyState": { + "title": "Пока нет данных о двойной опоре", + "description": "Измерения двойной опоры появятся здесь, как только Apple Health синхронизирует их." + } + }, + "navWalkingDoubleSupport": "Двойная опора", + "walkingStepLength": { + "title": "Длина шага при ходьбе", + "description": "Ваша средняя длина шага при ходьбе в динамике, в метрах.", + "chartTitle": "Длина шага", + "emptyState": { + "title": "Пока нет данных о длине шага", + "description": "Измерения длины шага появятся здесь, как только Apple Health синхронизирует их." + } + }, + "navWalkingStepLength": "Длина шага", + "walkingSpeed": { + "title": "Скорость ходьбы", + "description": "Ваша средняя скорость ходьбы в динамике, в км/ч.", + "chartTitle": "Скорость ходьбы", + "emptyState": { + "title": "Пока нет данных о скорости ходьбы", + "description": "Измерения скорости ходьбы появятся здесь, как только Apple Health синхронизирует их." + } + }, + "navWalkingSpeed": "Скорость ходьбы", + "mood": { + "logLink": "Записать настроение", + "heatmapTitle": "Календарь настроения", + "heatmapNoEntry": "Нет записи", + "legendGreat": "Отлично", + "legendGood": "Хорошо", + "legendOkay": "Нормально", + "legendLow": "Низкое", + "distributionTitle": "Распределение настроения", + "distributionDaysUnit": "дни", + "weekdayTitle": "Среднее по дням недели", + "weekdayNoData": "Нет данных", + "weekdayBestWorst": "Лучший день: {best}, самый трудный день: {worst}", + "tagsTitle": "Теги и триггеры", + "tagAvgMood": "Среднее настроение с тегом", + "correlationsTitle": "Настроение и другие показатели", + "correlationsDescription": "Как ваше настроение меняется вместе со сном, активностью и пульсом в один и тот же день.", + "correlation": { + "sleepTitle": "Настроение и сон", + "stepsTitle": "Настроение и активность", + "pulseTitle": "Настроение и пульс", + "sleepAxis": "Сон (мин)", + "stepsAxis": "Шаги", + "pulseAxis": "Пульс (уд/мин)", + "strengthStrong": "Сильная", + "strengthModerate": "Умеренная", + "strengthWeak": "Слабая", + "strengthNone": "Нет", + "source": "Парных дней: {n}, r = {r}", + "sourceLabel": "Как это рассчитано", + "emptyTitle": "Пока недостаточно парных данных", + "emptyDescription": "Записывайте настроение и этот показатель в одни и те же дни, чтобы увидеть корреляцию.", + "pendingDescription": "Пока {n} из {needed} парных дней. Корреляция появится, когда будет достаточно дней, чтобы отличить закономерность от случайности.", + "noLinkTitle": "Явной связи нет", + "noLinkDescription": "Парных дней: {n}, и ничего не выделяется сверх того, что дала бы случайность.", + "weightTitle": "Настроение и вес", + "bloodPressureTitle": "Настроение и АД", + "weightAxis": "Вес", + "bloodPressureAxis": "Систолическое (мм рт. ст.)" + }, + "structuredTagsTitle": "Разбивка по тегам", + "inTargetValue": "{pct} %", + "inTargetCaption": "недавних дней в вашем диапазоне хорошего настроения", + "narrative": { + "title": "Что выделяется", + "weekdayDip": "Ваше настроение сильнее всего падает в {weekday}, на {delta} ниже вашей недели.", + "weekdayPeak": "{weekday} стабильно ваш лучший день, в среднем {value}.", + "trendUp": "Ваше настроение растёт за последние {days} дней (+{delta} к предыдущему периоду).", + "trendDown": "Ваше настроение снижается за последние {days} дней (-{delta} к предыдущему периоду).", + "weekendUp": "Вы чувствуете себя лучше на выходных (+{delta} к будням).", + "weekendDown": "Ваше настроение ниже на выходных (-{delta} к будням).", + "tagLift": "Дни с тегом \"{tag}\" в среднем на {delta} выше вашего общего настроения.", + "tagDrop": "Дни с тегом \"{tag}\" на {delta} ниже вашего среднего.", + "inTarget": "Вы были в своём диапазоне хорошего настроения {pct} % последних 30 дней.", + "streak": "Вы записываете настроение {days} дней подряд. Так держать.", + "timeOfDay": "Вы чувствуете себя лучше всего в {bucket}, в среднем {value}." + }, + "timeOfDay": { + "title": "Настроение по времени суток", + "morning": "Утро", + "afternoon": "День", + "evening": "Вечер", + "night": "Ночь", + "bestCaption": "Вы обычно чувствуете себя лучше всего в {bucket}." + }, + "stability": { + "value": "{score}/100", + "bandVerySteady": "Ваше настроение было очень стабильным", + "bandSteady": "Ваше настроение было довольно стабильным", + "bandVariable": "Ваше настроение было заметно изменчивым", + "bandVeryVariable": "Ваше настроение сильно колебалось в последнее время", + "title": "Стабильность" + }, + "influence": { + "title": "Влияние на настроение", + "detail": "В среднем {withAvg} в {withDays} дней с этим тегом против {withoutAvg} без него.", + "confidenceLow": "Низкая уверенность", + "confidenceMedium": "Средняя уверенность", + "confidenceHigh": "Высокая уверенность" + }, + "betterDays": { + "title": "Что связано с вашими лучшими днями", + "description": "Теги и показатели, которые соотносятся с днями более высокого и более низкого настроения, упорядоченные по силе совместного изменения." + }, + "crosstab": { + "title": "Теги и ваши показатели здоровья", + "description": "Как показатель здоровья отличается в дни, когда вы отмечали каждую активность, по сравнению с днями, когда не отмечали.", + "pairLabel": "{metric} в дни с {tag}", + "metricActiveEnergy": "Активная энергия", + "metricSleepDuration": "Сон", + "metricNextDayRecovery": "Восстановление на следующий день", + "metricNextDayRestingHr": "ЧСС в покое на следующий день", + "metricNextDayHrv": "Вариабельность сердечного ритма на следующий день", + "detailSameDay": "В среднем {withAvg} в {withDays} дней с этим тегом против {withoutAvg} без него.", + "detailNextDay": "В среднем {withAvg} на следующий день после {withDays} дней с этим тегом против {withoutAvg} в остальные дни." + }, + "factorCrosstab": { + "title": "Ваши оценённые факторы и ваши показатели", + "description": "Как показатель отличается в дни, когда вы оценили каждый фактор низко, по сравнению с днями, когда оценили его высоко.", + "pairLabel": "{metric} в дни с {factor}", + "metricSleepDuration": "Сон", + "metricSteps": "Шаги", + "metricRestingHeartRate": "ЧСС в покое", + "metricHrv": "Вариабельность сердечного ритма", + "metricWeight": "Вес", + "metricBloodPressureSys": "Систолическое", + "detail": "В среднем {lowAvg} в {lowDays} дней, когда вы оценили {factor} низко, против {highAvg} в дни, когда оценили высоко.", + "detailInverse": "В среднем {lowAvg} в ваши {lowDays} худших дней по {factor} против {highAvg} в лучшие." + }, + "discovery": { + "title": "Что выделяется", + "subheading": "Обнаруженные связи", + "footer": "Выявлено из {tested} пар день-к-дню, проверенных по всем вашим показателям, после поправки на множественные сравнения.", + "disclaimer": "Статистически отфильтровано, но всё ещё наблюдательно: закономерность, за которой стоит следить, а не причина.", + "moodUp": "Более высокий {factor} в ваших данных обычно связан с более высоким настроением на следующий день.", + "moodDown": "Более высокий {factor} в ваших данных обычно связан с более низким настроением на следующий день.", + "outcomeUp": "Более высокое настроение в ваших данных обычно связано с более высоким {factor} на следующий день.", + "outcomeDown": "Более высокое настроение в ваших данных обычно связано с более низким {factor} на следующий день.", + "stat": "Парных дней: {n}, r = {r}, q = {q}", + "statLabel": "Как это рассчитано", + "explainerLabel": "Как это рассчитано", + "channel": { + "ALCOHOL": "употребление алкоголя", + "WORKOUT_MINUTES": "минуты тренировок", + "TRAINING_LOAD": "тренировочная нагрузка" + } + }, + "inTargetTitle": "В вашем диапазоне", + "dimensions": { + "title": "Состояние души", + "none": "О вашем состоянии души пока ничего не записано.", + "window": "Дней: {days}", + "noneInWindow": "в этом диапазоне ничего", + "higherIsMore": "выше = {anchor}", + "notRecorded": "Не записано: {list}." + }, + "contextComparison": { + "title": "Контекст дня и ваше настроение", + "description": "Как значение настроения было в дни, записанные до сих пор с этой записью, по сравнению с другими днями.", + "lower": "ниже", + "higher": "выше", + "statement": "В дни с «{label}» настроение в среднем было {direction}: {withAvg} против {withoutAvg}.", + "counts": "{withDays} дней с, {withoutDays} дней без", + "caveat": "Это показывает связь, а не причину." + }, + "prognosis": { + "title": "Ваша самооценка", + "selfLabel": "Ваша оценка", + "expectedLabel": "Ожидалось по вашей собственной закономерности", + "band": "Диапазон {low}–{high}", + "statement": "По вашим собственным закономерностям на данный момент для {date} ожидалось бы значение около {value}. Построено на {n} сопоставимых днях.", + "provisional": "Пока предварительно: закономерность опирается на короткий отрезок дней.", + "notToday": "Это описывает {date}, а не сегодня.", + "deviationWithin": "Ваша собственная оценка находится внутри этого диапазона.", + "deviationAbove": "Ваша собственная оценка на {amount} баллов выше этого диапазона.", + "deviationBelow": "Ваша собственная оценка на {amount} баллов ниже этого диапазона.", + "weightedTitle": "Что больше всего повлияло на сравнение этого дня", + "weightedUp": "{label}: учтено в сторону более высокого ожидаемого значения", + "weightedDown": "{label}: учтено в сторону более низкого ожидаемого значения", + "caveat": "Это сравнение с вашими собственными прошлыми днями, а не утверждение о том, почему день сложился именно так.", + "learning": "Фаза обучения: записано {entries} из {threshold} дней. Сравнение появится, когда их будет достаточно.", + "noPattern": "Ничто в {entries} записанных до сих пор днях не является достаточно устойчивым, чтобы сравнивать с ним день. Когда вы также фиксируете контекст дня, больше становится сопоставимым.", + "featureValue": "{field}: {value}", + "loadError": "Не удалось загрузить значение, ожидаемое по вашей собственной закономерности." + }, + "patterns": { + "title": "Закономерности в вашем настроении", + "basedOn": "На основе {subject} и {comparison} дней. Закономерность, а не причина.", + "previousDayHigher": "После дня ниже обычного следующий день обычно лучше ({subject} против {comparison} после дня выше обычного).", + "previousDayLower": "День ниже обычного обычно переходит в следующий ({subject} против {comparison} после дня выше обычного).", + "weekendHigher": "Ваше настроение обычно выше на выходных ({subject} против {comparison} в будни).", + "weekendLower": "Ваше настроение обычно ниже на выходных ({subject} против {comparison} в будни).", + "bestWeekday": "{weekday} обычно ваш лучший день ({subject} против {comparison} в остальные дни).", + "notesHigher": "В дни с заметкой ваше настроение обычно выше ({subject} против {comparison} без неё).", + "notesLower": "В дни с заметкой ваше настроение обычно ниже ({subject} против {comparison} без неё).", + "delayedTagHigher": "На следующий день после «{tag}» ваше настроение обычно выше ({subject} против {comparison} в остальные дни).", + "delayedTagLower": "На следующий день после «{tag}» ваше настроение обычно ниже ({subject} против {comparison} в остальные дни).", + "multipleEntriesHigher": "В дни, когда вы записываете больше одного раза, ваше настроение обычно выше ({subject} против {comparison} в дни с одной записью).", + "multipleEntriesLower": "В дни, когда вы записываете больше одного раза, ваше настроение обычно ниже ({subject} против {comparison} в дни с одной записью)." + } + }, + "derived": { + "coverage": { + "summary": "{present} из {required} входных данных ({percent} %)", + "ratioLabel": "{present}/{required}", + "historyDays": "На основе {count} дней истории", + "missing": "Отслеживайте это, чтобы уточнить: {list}", + "summaryLabelled": "{label} ({percent} %)" + }, + "scoreRing": { + "aria": "Балл {score} из 100, {band}", + "ariaProvisional": "Балл пока недоступен, недостаточно данных", + "provisionalCaption": "Пока недостаточно данных", + "band": { + "green": "хорошо", + "yellow": "удовлетворительно", + "red": "низко" + } + }, + "provenance": { + "title": "Как это рассчитано", + "trigger": "Как это рассчитано", + "inputsLabel": "Входные данные", + "noInputs": "Пока ни одни входные данные не подкрепляют это значение.", + "methodLabel": "Метод", + "window": "По вашим последним {days} дням данных {source}", + "asOf": "по состоянию на {date}", + "standardLink": "Стандарт: {name}" + }, + "vitals": { + "sectionTitle": "Ваши показатели", + "sectionSubtitle": "Сердечно-сосудистые и дыхательные сигналы в покое относительно вашего собственного базового уровня", + "loadingLabel": "Загрузка ваших показателей", + "loadError": "Не удалось загрузить ваши показатели прямо сейчас.", + "infoLabel": "Как это рассчитывается?", + "building": "Построение вашего типичного диапазона: {count} из {target} дней", + "typicalRange": "Типично для вас: {low}–{high}", + "fitnessYounger": "Кардиоформа человека примерно на {years} лет моложе", + "fitnessOlder": "Кардиоформа примерно на {years} лет выше вашего возраста", + "fitnessTypical": "Кардиоформа, типичная для вашего возраста", + "fitnessNoNorm": "Добавьте возраст и пол, чтобы это оценить", + "vascularBelow": "На {years} лет ниже вашего возраста", + "vascularAbove": "На {years} лет выше вашего возраста", + "vascularMatch": "Соответствует вашему возрасту", + "vascularNoAge": "Добавьте дату рождения, чтобы это оценить", + "hrvBand": { + "balanced": "Сбалансировано для вас", + "unbalanced": "Выше вашего обычного диапазона", + "low": "Ниже вашего обычного диапазона" + }, + "bmiCategory": { + "underweight": "Недостаточный вес (ВОЗ)", + "normal": "Нормальный диапазон (ВОЗ)", + "overweight": "Избыточный вес (ВОЗ)", + "obese": "Ожирение (ВОЗ)" + }, + "sixMinuteBand": { + "green": "{percent} % от прогнозируемого для вашего профиля", + "yellow": "{percent} % от прогнозируемого для вашего профиля", + "red": "{percent} % от прогнозируемого для вашего профиля" + }, + "sixMinuteNoBand": "Добавьте возраст, рост, вес и пол, чтобы это оценить", + "mobilitySectionTitle": "Подвижность и тело" + }, + "anatomy": { + "outOf": "/100", + "contributorsLabel": "Составляющие", + "contributorValue": "{value}, вес {weight} %", + "contributorMissing": "нет данных", + "insufficient": "Пока недостаточно данных, чтобы это оценить. Продолжайте отслеживать, и это появится здесь." + }, + "composite": { + "SLEEP_SCORE": { + "title": "Балл сна", + "description": "Прозрачный балл качества сна с показом каждого подбалла.", + "method": "Смесь от 0 до 100 из достаточности (сон против вашей потребности по возрасту), эффективности (сон ÷ время в постели), регулярности (насколько стабильна середина сна), времени (относительно вашей привычной середины) и состава (доля REM + глубокой фазы). Подбаллы перераспределяются вокруг тех, которые не поддерживаются вашими данными; ничего не выдумывается.", + "sub": { + "sufficiency": "Достаточность", + "efficiency": "Эффективность", + "consistency": "Регулярность", + "timing": "Время", + "composition": "Состав" + }, + "gap": { + "fewNights": "пока недостаточно ночей ({count} из {needed})", + "noMainSleep": "в последний день был только дневной сон" + } + }, + "READINESS": { + "title": "Готовность", + "description": "Ежедневное приближение благополучия по тому, как ваши сигналы соотносятся с вашим собственным базовым уровнем.", + "method": "Смесь от 0 до 100 из отклонения ЧСС в покое, отклонения HRV (SDNN), достаточности сна, стабильности частоты дыхания и стабильности настроения, каждый измеряется относительно вашего личного базового уровня. Веса перенормируются по компонентам, которые поддерживаются вашими данными. Приближение благополучия, а не балл восстановления или клинический балл.", + "component": { + "rhr": "ЧСС в покое", + "hrv": "ВСР (SDNN)", + "sleep": "Сон", + "respiratory": "Частота дыхания", + "mood": "Стабильность настроения" + } + }, + "VITALS_BASELINE": { + "method": "Ваш личный типичный диапазон — это медиана ваших ежедневных значений за окно ± устойчивый разброс (медианное абсолютное отклонение, масштабированное). Он отслеживает ВАШИ измерения, а не популяционную норму, поэтому значение внутри полосы типично для вас." + }, + "HRV_BALANCE": { + "method": "Ваше недавнее среднее HRV (SDNN), сопоставленное с вашим собственным скользящим базовым уровнем (медиана ± устойчивый разброс). «Сбалансировано» означает, что оно находится внутри вашего личного диапазона; полоса строится по вашим данным, а не по популяционному порогу." + }, + "BMI": { + "method": "Вес ÷ рост², классифицируется по взрослым категориям ВОЗ (недостаточный вес / норма / избыточный вес / ожирение). Только скрининговое соотношение; оно не отличает мышцы от жира." + }, + "FITNESS_AGE": { + "method": "Ваш VO₂max, сопоставленный с процентилями кардиореспираторной формы по возрасту и полу, выраженный как разница в возрасте формы. VO₂max — это оценка вашего устройства, здесь она никогда не пересчитывается." + }, + "VASCULAR_AGE_DELTA": { + "method": "Оценка сосудистого возраста / скорости пульсовой волны вашего устройства, сравнённая с вашим хронологическим возрастом, выраженная как разница в годах. Оценка принадлежит устройству; HealthLog лишь переформулирует её.", + "caveat": "Собственная оценка вашего устройства, переформулированная: описательная, а не клиническая оценка сосудов.", + "description": "Как оценка сосудистого возраста вашего устройства соотносится с вашим хронологическим возрастом." + }, + "COINCIDENT_DEVIATION": { + "method": "Флаг, поднимаемый, когда два или более ваших показателей в один и тот же день выходят за пределы их личного типичного диапазона. Каждая полоса — это устойчивая медиана ± k·MAD вашей собственной истории, поэтому она адаптируется к вам, а не к популяционному порогу.", + "caveat": "Флаг осведомлённости по вашим собственным базовым уровням: описательный, а не диагноз или клиническая тревога." + }, + "RECOVERY_SCORE": { + "method": "Ночное приближение восстановления от 0 до 100, смешанное из вашего HRV, ЧСС в покое и сна относительно вашего собственного базового уровня. Выше означает лучше восстановлен. Рассчитывается раз за ночь и читается здесь, никогда не пересчитывается на лету.", + "description": "Ночной показатель восстановления по вариабельности сердечного ритма, ЧСС в покое и сну." + }, + "STRESS_SCORE": { + "method": "Ночной показатель стресса от 0 до 100 по форме вариабельности сердечного ритма в течение дня относительно вашего базового уровня. Чем выше, тем больше физиологическая нагрузка.", + "description": "Ночной показатель стресса по форме вариабельности сердечного ритма в течение дня." + }, + "STRAIN_SCORE": { + "method": "Ночной показатель напряжения от 0 до 100 по взвешенной по ЧСС нагрузке активности (модель тренировочного импульса в стиле TRIMP). Чем выше, тем тяжелее был день.", + "anchorPersonal": "Привязан к вашей недавней нагрузке в тренировочные дни и оценивается относительно вашего типичного усилия, поэтому по-настоящему тяжёлый для вас день получает высокий балл.", + "anchorPopulation": "Оценивается по общему ориентиру, пока вы накапливаете историю тренировок; когда её станет достаточно, оценка переключится на ваше типичное усилие.", + "description": "Ночной показатель нагрузки активности по взвешенному по ЧСС усилию относительно вашего типичного усилия.", + "deviceCaption": "Напряжение за день по данным устройства: {value} из {max}", + "deviceSource": "Пока HealthLog не рассчитает собственное значение за ночь, карточка показывает напряжение за день по данным устройства, пересчитанное в шкалу 0–100." + }, + "WRIST_TEMPERATURE_BASELINE": { + "method": "Ваша типичная ночная температура кожи запястья — это медиана ночных измерений за период ± устойчивый разброс (масштабированное медианное абсолютное отклонение). Она отражает ВАШИ измерения: прошлая ночь показана как отклонение от вашего собственного базового уровня, а не от популяционной нормы.", + "caveat": "Только полоса личного отклонения: описательная, а не сигнал заболевания, лихорадки или фазы цикла. Интерпретируйте её сами." + }, + "STAIR_ASCENT_SPEED_BASELINE": { + "method": "Ваш типичный темп подъёма по лестнице — это медиана дневных значений за период ± устойчивый разброс (масштабированное медианное абсолютное отклонение). Полоса строится по вашим данным. Популяционного порога скорости подъёма нет, потому что темп зависит от геометрии лестницы и длины ног.", + "caveat": "Полоса личной динамики мобильности: описательная, а не оценка хрупкости или риска падений." + }, + "STAIR_DESCENT_SPEED_BASELINE": { + "method": "Ваш типичный темп спуска по лестнице — это медиана дневных значений за период ± устойчивый разброс (масштабированное медианное абсолютное отклонение). Полоса строится по вашим данным. Популяционного порога скорости спуска нет, потому что темп зависит от геометрии лестницы и длины ног.", + "caveat": "Полоса личной динамики мобильности: описательная, а не оценка хрупкости или риска падений." + }, + "SIX_MINUTE_WALK_BAND": { + "method": "ОЦЕНОЧНАЯ дистанция шестиминутной ходьбы по данным устройства сопоставлена с ориентиром Enright & Sherrill для вашего возраста, роста, веса и пола в процентах от предсказанной. Дистанция — это оценка устройства, здесь она не пересчитывается. Без вашего возраста, роста, веса и пола процент скрыт, показаны только дистанция и динамика.", + "caveat": "Оценка, сопоставленная с опубликованным ориентиром: сигнал осведомлённости о функциональных возможностях, а не клинический тест шестиминутной ходьбы и не диагноз. Ориентир установлен для возраста 40–80 лет; за пределами этого диапазона предсказанное значение — экстраполяция." + }, + "TRAJECTORY": { + "method": "Прямая, построенная методом наименьших квадратов по вашим недавним дневным значениям и продолженная на короткий горизонт, с классическим интервалом предсказания, который расширяется по мере удаления. Рассчитывается, только если недавняя динамика достаточно сильна, а история достаточно длинна и актуальна; иначе линия не рисуется.", + "caveat": "Проекция вашей собственной недавней динамики, а не предсказание, цель или клинический прогноз. Она верна, только если недавняя закономерность сохранится; заштрихованная полоса показывает, как быстро эта определённость убывает." + }, + "SAME_TIME_BASELINE": { + "method": "Ваш накопленный итог за сегодня сопоставлен с медианой того же местного часа за последние четыре недели, с устойчивой полосой медиана ± MAD вокруг неё. Учитываются только дни с достаточной детализацией записей, и сравнение не показывается, пока их не наберётся хотя бы четырнадцать.", + "caveat": "Сравнение с вашей собственной недавней историей, а не цель. Оно показывает, где сегодняшний день находится относительно вашей обычной картины в этот час, и ничего не говорит о том, подходит ли эта картина вам." + } + }, + "scores": { + "sectionTitle": "Ваши баллы здоровья", + "sectionSubtitle": "Сводные показатели восстановления, стресса и напряжения по данным подключённых устройств", + "loadError": "Не удалось загрузить ваши баллы самочувствия прямо сейчас.", + "loadingLabel": "Загрузка баллов здоровья", + "recovery": "Балл восстановления", + "recoveryCrossLink": "Посмотреть данные восстановления и напряжения с носимого устройства", + "stress": "Стресс", + "strain": "Напряжение", + "historyTitle": "История", + "historyWindow": "Последние {days} дней" + }, + "coincident": { + "label": "Несколько показателей вне базового уровня", + "summary": "{count} ваших показателей сегодня вышли за пределы личного диапазона.", + "vitals": "Вне диапазона: {list}", + "cardTitle": "Сигналы дня", + "allClear": "Все ваши показатели сегодня в пределах личного диапазона.", + "allClearMeta": "Проверено {count} ваших показателей относительно вашего типичного диапазона.", + "watch": "Один показатель сегодня вне обычного диапазона.", + "watchVital": "Вне диапазона: {vital}. Часто это разовое явление, но стоит присмотреться в ближайшие дни.", + "firedHeadline": "{count} ваших показателей сегодня вне личного диапазона.", + "factors": "Возможные факторы (но не причина): тяжёлая тренировка, плохой сон, алкоголь, высота, стресс или заболевание. Это осведомлённость по вашим собственным базовым уровням, а не диагноз.", + "building": "Строим ваши личные базовые уровни. Отслеживайте ещё несколько дней, и это появится.", + "illnessExplained": "Эти сдвиги, вероятно, отражают состояние, которое вы записали." + }, + "trajectory": { + "cardTitle": "Проекция на короткий горизонт", + "headline": "Если эта закономерность сохранится: следующие {days} дней", + "range": "Прогноз около {low}–{high} {unit} через {days} дней.", + "caveat": "Проекция вашей собственной недавней динамики, а не предсказание. Заштрихованная полоса расширяется, показывая, как быстро растёт неопределённость.", + "insufficient": "Пока недостаточно чёткой динамики для проекции. Продолжайте отслеживать, и проекция появится, когда недавняя закономерность станет достаточно сильной.", + "daysNeeded": "Нужно ещё около {count} дней отслеживания, прежде чем появится проекция." + }, + "sameTime": { + "sectionTitle": "Сегодня на данный момент", + "sectionSubtitle": "Ваши накопленные итоги в сравнении с обычным для вас в этот час", + "learning": "Изучаем ваш обычный день: {count} из {target} дней", + "framing": "Обычно к {time}: {typical} {unit}", + "comparisonLabel": "Ваш типичный день" + } + }, + "cardioFitness": { + "title": "Кардио-фитнес", + "description": "Ваш VO₂ max в динамике — главный показатель аэробной формы.", + "chartTitle": "VO₂ max (мл/(кг·мин))", + "emptyState": { + "title": "Пока нет данных о кардио-фитнесе", + "description": "Измерения VO₂ max появятся здесь, когда Apple Health синхронизирует их из ваших тренировок." + } + }, + "navCardioFitness": "Кардио-фитнес", + "cardioRecovery": { + "title": "Кардио-восстановление", + "description": "Насколько падает ЧСС через минуту после пиковой нагрузки.", + "chartTitle": "Кардио-восстановление (уд/мин)", + "emptyState": { + "title": "Пока нет данных о кардио-восстановлении", + "description": "Измерения кардио-восстановления появятся здесь, когда Apple Health синхронизирует их из тренировки." + } + }, + "navCardioRecovery": "Кардиовосстановление", + "wristTemperature": { + "title": "Температура кожи запястья", + "description": "Ваша ночная температура кожи запястья в сравнении с собственным базовым уровнем.", + "chartTitle": "Температура кожи запястья", + "emptyState": { + "title": "Пока нет данных о температуре кожи запястья", + "description": "Измерения температуры кожи запястья появятся здесь, когда Apple Health синхронизирует данные ношения." + } + }, + "navWristTemperature": "Темп. запястья", + "falls": { + "title": "Падения", + "description": "Сильные падения, обнаруженные Apple Watch, по дням.", + "chartTitle": "Падения за день", + "emptyState": { + "title": "Пока нет данных о падениях", + "description": "Обнаруженные падения появятся здесь, когда Apple Health синхронизирует их. Цель — ноль падений." + } + }, + "navFalls": "Падения", + "sixMinuteWalk": { + "title": "Шестиминутная ходьба", + "description": "Оценка Apple того, какое расстояние вы могли бы пройти за шесть минут.", + "chartTitle": "Дистанция шестиминутной ходьбы (м)", + "emptyState": { + "title": "Пока нет данных о шестиминутной ходьбе", + "description": "Оценки шестиминутной ходьбы появятся здесь, когда Apple Health синхронизирует их." + } + }, + "navSixMinuteWalk": "6-мин ходьба", + "stairAscentSpeed": { + "title": "Скорость подъёма по лестнице", + "description": "Как быстро вы поднимаетесь по лестнице, по данным iPhone или Watch.", + "chartTitle": "Скорость подъёма по лестнице (м/с)", + "emptyState": { + "title": "Пока нет данных о скорости подъёма по лестнице", + "description": "Измерения скорости подъёма по лестнице появятся здесь, когда Apple Health синхронизирует их." + } + }, + "navStairAscentSpeed": "Подъём по лестнице", + "stairDescentSpeed": { + "title": "Скорость спуска по лестнице", + "description": "Как быстро вы спускаетесь по лестнице, по данным iPhone или Watch.", + "chartTitle": "Скорость спуска по лестнице (м/с)", + "emptyState": { + "title": "Пока нет данных о скорости спуска по лестнице", + "description": "Измерения скорости спуска по лестнице появятся здесь, когда Apple Health синхронизирует их." + } + }, + "navStairDescentSpeed": "Спуск по лестнице", + "breathingDisturbances": { + "title": "Нарушения дыхания", + "description": "Как часто ваше дыхание нарушалось во сне.", + "chartTitle": "Нарушения дыхания во сне", + "emptyState": { + "title": "Пока нет данных о нарушениях дыхания", + "description": "Измерения дыхания во сне появятся здесь, когда Apple Health синхронизирует их с поддерживаемых Apple Watch." + } + }, + "navBreathingDisturbances": "Дыхание", + "rhythmEvents": { + "sectionTitle": "Уведомления о здоровье с устройства", + "sectionIntro": "Уведомления, которые ваши часы отправили самостоятельно. HealthLog только показывает их. Он не обнаруживает, не подтверждает и не интерпретирует их.", + "loadError": "Не удалось загрузить уведомления с устройства.", + "disclaimer": "Это оповещения, которые ваше устройство сформировало с помощью собственного встроенного обнаружения. Они показаны здесь только для вашей осведомлённости. Это не медицинская оценка от HealthLog, и HealthLog не диагностирует никаких состояний. Если уведомление вас беспокоит, поговорите с врачом.", + "event": { + "irregularRhythm": "Уведомление о нерегулярном ритме", + "highHeartRate": "Уведомление о высокой ЧСС", + "lowHeartRate": "Уведомление о низкой ЧСС", + "walkingSteadiness": "Оповещение об устойчивости ходьбы", + "breathingDisturbance": "Нарушение дыхания во сне" + }, + "verdict": { + "irregular": "Ваше устройство отметило возможный нерегулярный ритм.", + "notDetected": "Ваше устройство не отметило нерегулярный ритм.", + "inconclusive": "Ваше устройство не смогло сделать измерение.", + "low": "Ваше устройство отметило низкую устойчивость ходьбы.", + "veryLow": "Ваше устройство отметило очень низкую устойчивость ходьбы.", + "fired": "Ваше устройство отметило это событие." + } + }, + "trendDescriptor": { + "rising": "Рост за 30 дней ({delta}{unit}).", + "falling": "Снижение за 30 дней ({delta}{unit}).", + "stable": "Стабильно за последние 30 дней.", + "moodImproved": "Настроение немного улучшилось за 30 дней.", + "moodDeclined": "Настроение немного ухудшилось за 30 дней.", + "moodStable": "Настроение оставалось стабильным последние 30 дней." + }, + "target": { + "heading": "Цель" + }, + "settings": { + "overviewTitle": "Настроить обзор", + "overviewDescription": "Показывайте или скрывайте разделы и задавайте их порядок в обзоре аналитики." + }, + "pillOrder": { + "title": "Сортировка навигационных чипов", + "description": "Перетащите чипы в нужном порядке и показывайте или скрывайте их значком глаза.", + "dragHandle": "Изменить порядок", + "saveSuccess": "Порядок чипов сохранён", + "saveError": "Не удалось сохранить порядок чипов.", + "save": "Сохранить", + "empty": "Навигационные чипы пока недоступны.", + "detail": "Скрытые страницы деталей также убираются из верхней навигации." + }, + "customize": "Настроить аналитику", + "regenerateRateLimited": "Достигнут лимит обновлений. Попробуйте позже.", + "regenerateUnavailable": "Свежий анализ не поступил. Попробуйте позже.", + "regenerateError": "Всё ещё обновляется. Попробуйте через минуту.", + "regenerateSettling": "Ваша оценка всё ещё готовится", + "regenerateSettleFailed": "Не удалось завершить обновление. Попробуйте позже.", + "deviceScore": { + "learning": "Изучаем ваш базовый уровень. Ещё несколько ночей заполнят динамику.", + "average": "Среднее за 30 дней {value}", + "unitScore": "балл", + "unitMinutes": "мин", + "unitBpm": "уд/мин", + "unitKj": "кДж" + }, + "sleepQuality": { + "title": "Качество сна", + "subtitle": "Ночные баллы с носимого устройства" + }, + "recovery": { + "title": "Восстановление", + "description": "Насколько хорошо ваш организм восстановился: сигналы восстановления, напряжения и нагрузки, которые носимые устройства записывают за ночь.", + "scoreCrossLink": "Посмотреть сводный балл восстановления", + "emptyTitle": "Пока нет данных о восстановлении", + "empty": "Эта страница заполняется показателями заряда, напряжения и нагрузки от WHOOP или Polar и уровнем устойчивости Oura.", + "emptyOuraPermission": "Уровню устойчивости Oura нужно разрешение на стресс, поэтому подключите Oura ещё раз в разделе «Интеграции» и разрешите его.", + "emptyOuraNoResilience": "Oura подключена, и её уровень устойчивости появится здесь, как только Oura его предоставит.", + "emptyAction": "Открыть интеграции", + "block": { + "ansChargeExplainer": "Насколько заряжена ваша вегетативная нервная система на предстоящий день — показатель заряда по ночным сигналам сердца и дыхания.", + "dayStrainExplainer": "Общая сердечно-сосудистая нагрузка за день по шкале напряжения вашего устройства. Читайте её вместе с восстановлением, а не как самостоятельную цель.", + "workoutStrainExplainer": "Насколько требовательной была отдельная тренировка по той же шкале напряжения: сердечно-сосудистая цена этой сессии.", + "cardioLoadExplainer": "Показатель тренировочной нагрузки, отражающий накопленную острую сердечно-сосудистую нагрузку. Сравнивайте его со своими недавними днями.", + "averageHeartRateExplainer": "Ваша средняя ЧСС за весь день или цикл по данным носимого устройства.", + "maxHeartRateExplainer": "Ваша пиковая ЧСС за весь день или цикл по данным носимого устройства.", + "energyExpenditureKjExplainer": "Энергия, которую ваш организм потратил за день, в килоджоулях, как её передаёт устройство." + }, + "loadError": "Не удалось загрузить данные восстановления." + }, + "bodyTempDeviation": { + "title": "Отклонение температуры тела", + "subtitle": "Ночное отклонение от вашего базового уровня" + }, + "resilience": { + "explainer": "Насколько хорошо ваш организм уравновешивает ежедневное напряжение восстановлением, по ночным сигналам за последние дни.", + "learning": "Изучаем вашу устойчивость. Ещё несколько дней определят полосу.", + "band": { + "limited": "Ограниченная", + "adequate": "Достаточная", + "solid": "Хорошая", + "strong": "Сильная", + "exceptional": "Исключительная" + }, + "trend": { + "above": "Выше вашего недавнего среднего.", + "steady": "Соответствует вашему недавнему среднему.", + "below": "Ниже вашего недавнего среднего." + } + }, + "briefing": { + "memory": { + "forwardWatch": "Стоит присмотреться к {metric}.", + "forwardHolding": "Пока всё держится стабильно." + } + }, + "updatedTodayAt": "Обновлено сегодня, {time}", + "updatedYesterday": "Обновлено вчера", + "updatedOn": "Обновлено {date}", + "healthStatus": { + "sectionTitle": "Что изменилось", + "subtitle": "Сигналы, отклоняющиеся от вашего обычного диапазона.", + "deviationAbove": "{vital} выше вашего типичного диапазона.", + "deviationBelow": "{vital} ниже вашего типичного диапазона.", + "shiftUp": "{vital} сместился вверх от вашей недавней нормы.", + "shiftDown": "{vital} сместился вниз от вашей недавней нормы.", + "rangeContext": "Сейчас {value}, обычно {low}–{high}.", + "rangeContextTimeOfDay": "Сейчас {value}, обычно {low}–{high} в это время дня.", + "shiftContext": "Около {before} до, {after} после.", + "shiftDays": "На основе {before} дней до и {after} после." + }, + "breathingScreening": { + "sectionTitle": "Дыхание во сне", + "subtitle": "Скрининговый сигнал по данным вашего сна.", + "classificationElevated": "Ваше устройство отметило повышенные нарушения дыхания.", + "classificationNotElevated": "Классификация вашего устройства не повышена.", + "trendUp": "Динамика выше, чем в ваши прежние ночи.", + "trendDown": "Динамика ниже, чем в ваши прежние ночи.", + "trendStable": "Держится стабильно относительно ваших прежних ночей.", + "nights": "Отслежено ночей: {count}", + "indexLine": "недавний средний индекс {value}", + "eventsFlagged": "Событий отмечено устройством: {count}", + "disclaimer": "Это скрининговый сигнал, а не диагноз. Обсудите с врачом." + }, + "labsChanges": { + "sectionTitle": "С последней панели", + "subtitle": "Как ваши последние результаты соотносятся с предыдущей панелью.", + "statusInRange": "в диапазоне", + "statusBelow": "ниже диапазона", + "statusAbove": "выше диапазона", + "directionFlat": "без изменений" + }, + "navGripStrength": "Сила хвата", + "navPainNrs": "Боль", + "navWaistCircumference": "Талия", + "navWaistToHeight": "Талия/рост", + "gripStrength": { + "title": "Сила хвата", + "description": "Максимальная сила кисти — надёжный показатель силы всего тела. Ниже полового порога (мужчины 27 кг, женщины 16 кг) указывает на вероятную саркопению; в первую очередь смотрите на собственную динамику.", + "chartTitle": "Сила хвата", + "emptyState": { + "title": "Пока нет данных о силе хвата", + "description": "Запишите измерение с кистевого динамометра (фиксируйте лучшее из нескольких сжатий), и динамика появится здесь.", + "cta": "Записать силу хвата" + }, + "coachPrefill": "Я ещё не записывал силу хвата. Что она говорит о здоровье моих мышц и как её измерять и улучшать?" + }, + "pain": { + "title": "Боль (0–10)", + "description": "Интенсивность боли по шкале от 0 до 10, где 0 — нет боли, а 10 — самая невыносимая. Устойчивое изменение на 2 балла — сигнал, за которым стоит следить.", + "chartTitle": "Боль (0–10)", + "emptyState": { + "title": "Пока нет оценок боли", + "description": "Запишите, насколько сильна боль сейчас, по шкале 0–10, и динамика появится здесь.", + "cta": "Записать оценку боли" + }, + "coachPrefill": "Я ещё не записывал оценки боли. Как отслеживать боль по шкале 0–10 и что считается значимым изменением?" + }, + "waist": { + "title": "Окружность талии", + "description": "Обхват талии в сантиметрах — показатель центрального жира. Порог повышенного риска ВОЗ зависит от пола (мужчины 94 см, женщины 80 см); в первую очередь смотрите на собственную динамику.", + "chartTitle": "Окружность талии", + "emptyState": { + "title": "Пока нет измерений талии", + "description": "Измерьте талию посередине между нижним ребром и тазовой костью, в конце обычного выдоха, и запишите здесь.", + "cta": "Записать окружность талии" + }, + "coachPrefill": "Я ещё не записывал измерения талии. Как правильно измерить талию и что это число значит для моего здоровья?" + }, + "waistToHeight": { + "title": "Отношение талии к росту", + "description": "Ваша талия, делённая на рост, — устойчивое к происхождению число. Простая цель — держать его ниже 0,5 (талия меньше половины роста).", + "chartTitle": "Отношение талии к росту", + "emptyState": { + "title": "Пока нет отношения талии к росту", + "description": "Запишите отношение талии к росту, и динамика появится здесь. Правило: держите талию меньше половины роста.", + "cta": "Записать отношение талии к росту" + }, + "coachPrefill": "Я ещё не записывал отношение талии к росту. Почему это полезное число и как держать его ниже 0,5?" + }, + "ecg": { + "sectionTitle": "Записи ЭКГ", + "loadError": "Не удалось загрузить записи ЭКГ.", + "backToList": "Назад к записям", + "clinicianNote": "Если этот результат вас беспокоит, обсудите эту запись с врачом.", + "resultAttribution": "Записанный результат: {result}, по данным записывающего устройства.", + "result": { + "irregular": "Обнаружена фибрилляция предсердий", + "notDetected": "Признаков фибрилляции предсердий нет", + "inconclusive": "Неоднозначная запись", + "none": "Результат не сообщён" + }, + "meta": { + "recorded": "Записано", + "duration": "Длительность", + "lead": "Отведение", + "averageHeartRate": "Средняя ЧСС", + "samplingRate": "Частота дискретизации", + "leadSingle": "Одно отведение (отведение I)", + "durationValue": "{seconds} с", + "bpmValue": "{bpm} уд/мин", + "hzValue": "{hz} Гц", + "unknown": "—" + }, + "waveform": { + "ariaLabel": "Запись ЭКГ от {date}, длительность {duration}, средняя ЧСС {heartRate}, записанный результат: {result}." + }, + "crossLink": { + "title": "Записи ЭКГ", + "recordingsOne": "1 запись в архиве.", + "recordingsMany": "Записей в архиве: {count}.", + "latestResult": "Последний результат устройства: {result}.", + "cta": "Посмотреть записи" + }, + "emptyTitle": "Пока нет записей ЭКГ", + "emptyDescription": "Записи ЭКГ синхронизируются с совместимого устройства с одним отведением. Как только устройство загрузит запись, она появится здесь.", + "emptyCta": "Подключить устройство" + }, + "intradayPulse": { + "title": "Пульс в течение дня", + "caption": "Усреднено шагами по 10 минут.", + "hourlyNote": "Показано среднее по часам за этот день; для недавних дней доступна полная детализация по 10 минут.", + "empty": "Пока недостаточно измерений ЧСС за этот день, чтобы показать его форму.", + "coverageOne": "На основе 1 измерения за {hours} ч.", + "coverageMany": "На основе {count} измерений за {hours} ч.", + "baseline": "В покое", + "today": "Сегодня", + "previousDay": "Предыдущий день", + "nextDay": "Следующий день", + "tension": { + "morning": "Устойчивый период повышенной ЧСС в покое этим утром, возможно, некоторое напряжение.", + "afternoon": "Устойчивый период повышенной ЧСС в покое днём, возможно, некоторое напряжение.", + "evening": "Устойчивый период повышенной ЧСС в покое вечером, возможно, некоторое напряжение.", + "night": "Устойчивый период повышенной ЧСС в покое ночью, возможно, некоторое напряжение." + } + }, + "navEcg": "ЭКГ", + "sectionLoadError": "Не удалось загрузить этот раздел.", + "aiSetupHint": { + "title": "ИИ необязателен", + "body": "Всё здесь работает без ИИ. Если вы хотите ежедневную сводку, короткие заметки к измерениям и Коуча, можно подключить провайдера ИИ.", + "settingsBody": "HealthLog полностью работает без ИИ. Подключите провайдера ниже, если хотите ежедневную сводку, короткие заметки к измерениям и Коуча.", + "action": "Настроить ИИ", + "dismiss": "Не сейчас" + }, + "bmiHeight": { + "coachPrefill": "Я ещё не указал свой рост. Почему ИМТ важен и что нужно знать, прежде чем его настроить?" + }, + "medicationsEmpty": { + "coachPrefill": "Я ещё не добавил ни одного лекарства. Что нужно знать, прежде чем начать отслеживать приверженность приёму лекарств здесь?" + }, + "scoreHistory": { + "healthTitle": "История балла здоровья", + "healthDescription": "Ваш балл здоровья день за днём, как он отображался в каждый день.", + "emptyDescription": "В этом диапазоне пока не записано ни одного балла.", + "usualRange": "Заштриховано: ваш обычный диапазон, {lo}–{hi}.", + "seam": "Линия прерывается там, где изменилось то, что учитывается в балле." + } + }, + "thresholds": { + "defaultLabel": "По умолчанию", + "overrideToggleLabel": "Свой диапазон", + "resetAction": "Сбросить к значению по умолчанию", + "resetAllAction": "Сбросить всё к значениям по умолчанию", + "resetAllTitle": "Сбросить все свои диапазоны?", + "resetAllBody": "Каждый показатель вернётся к диапазону по умолчанию. Заданные вами значения больше нигде не хранятся, и вернуть их нельзя.", + "resetAllConfirm": "Сбросить всё", + "resetTitle": "Сбросить этот диапазон?", + "resetBody": "Показатель вернётся к диапазону по умолчанию. Заданные вами значения больше нигде не хранятся, и вернуть их нельзя.", + "resetConfirm": "Сбросить диапазон", + "minLabel": "Мин", + "maxLabel": "Макс", + "unitSuffix": "({unit})", + "outOfBoundsHint": "Допустимый диапазон: {min}–{max} {unit}", + "overrideWarning": "Задание значений вне рекомендованных диапазонов может дать нездоровые цели. Делайте это только по совету врача.", + "saveSuccess": "Пороги обновлены", + "saveError": "Не удалось сохранить пороги", + "resetSuccess": "Сброшено к значению по умолчанию", + "sourceOverride": "Пользовательское значение", + "metricWeight": "Вес", + "metricBpSys": "АД (систолическое)", + "metricBpDia": "АД (диастолическое)", + "metricPulse": "Пульс в покое", + "metricBodyFat": "Жировая масса", + "metricSleep": "Длительность сна", + "metricSteps": "Шаги за день", + "metricGlucoseFasting": "Глюкоза (натощак)", + "metricGlucosePostprandial": "Глюкоза (после еды)", + "metricGlucoseRandom": "Глюкоза (случайная)", + "metricGlucoseBedtime": "Глюкоза (перед сном)", + "metricBodyWater": "Вода в организме", + "metricBoneMass": "Костная масса", + "metricOxygenSaturation": "Насыщение кислородом (SpO₂)", + "unsetExplanation": "Без переопределения, используется вычисленное значение по умолчанию.", + "cardTitle": "Диапазоны по показателям" + }, + "onboarding": { + "errorGeneric": "Что-то пошло не так при завершении настройки. Попробуйте ещё раз.", + "tour": { + "stepOf": "Шаг {current} из {total}", + "next": "Далее", + "back": "Назад", + "skip": "Пропустить тур", + "done": "Понятно", + "steps": { + "dashboardOverview": { + "title": "Ваша сводка", + "body": "Сводка собирает все модули вместе с первого взгляда. Долгое нажатие на плитку меняет её порядок или скрывает её (Настройки → Расположение сводки). Каждая плитка говорит лишь столько, сколько данных за ней, а модули впереди их наполняют." + }, + "quickAdd": { + "title": "Запись за секунды", + "body": "Используйте «+ Добавить», чтобы за секунды записать любое измерение: вес, АД, пульс, глюкозу. Скрытая сила: задним числом вносите измерения, которые забыли записать. Всё, что вы здесь записываете, питает динамику, балл здоровья и аналитику ИИ." + }, + "measurements": { + "title": "Измерения и целевые диапазоны", + "body": "«Измерения» показывает историю и целевой диапазон для каждого показателя. Скрытая жемчужина: задайте целевой диапазон для значения, чтобы отклонения выделялись цветом. Эти ряды — основа корреляций Коуча и отчёта для врача." + }, + "medications": { + "title": "Лекарства и приёмы", + "body": "«Лекарства» управляет расписаниями, приёмами, запасом и титрацией. Скрытое: повторяющиеся планы (RRULE/скользящие) и предупреждения о низком запасе. Ваша приверженность питает столп приверженности в сводке и контекст ИИ." + }, + "labs": { + "title": "Лабораторные показатели", + "body": "«Анализы» фиксирует показатели с референсными диапазонами: кровь, холестерин, HbA1c (гликированный гемоглобин). Сила: импорт и экспорт FHIR. Значения вне диапазона всплывают как доказательства в аналитике и отчёте для врача." + }, + "illness": { + "title": "Дневник болезней", + "body": "Дневник болезней фиксирует острые эпизоды и хронические диагнозы с их обострениями. Скрытое: сопоставление эпизода с вашими измерениями и режим отдыха, который приостанавливает напоминания. Так Коуч понимает, почему значения на время отклоняются." + }, + "vorsorge": { + "title": "Профилактика", + "body": "«Профилактика» напоминает о скринингах и вакцинациях с их собственным интервалом. Совет: «Готово» может сразу создать измерение или результат анализа. Просроченные пункты появляются как напоминания и в отчёте для врача." + }, + "cycle": { + "title": "Цикл", + "body": "Отслеживание цикла фиксирует фазы и симптомы. Скрытое: сравнение симптомов с настроением и сном. Цикл даёт контекст для колебаний, которые иначе выглядели бы необъяснимыми." + }, + "mood": { + "title": "Настроение", + "body": "«Настроение» за две секунды фиксирует, как вы себя чувствуете, и теги. Сила: ваши собственные теги. Динамика настроения коррелирует со сном, лекарствами и циклом, а Коуч находит закономерности." + }, + "insights": { + "title": "Аналитика", + "body": "«Аналитика» — сердце всего: доказательный динамический анализ вместо общих советов. Каждое утверждение указывает на ваши реальные данные. Скрытое: расположение можно настроить. Аналитика собирает всё, что дают модули выше." + }, + "coach": { + "title": "Тренер", + "body": "Коуч отвечает на вопросы о ваших данных в диалоге, используя вашу историю, лекарства и результаты анализов как контекст. Провайдера ИИ выбираете вы сами (свой ключ или локальный). Он ничего не пересчитывает; он читает те же числа, что и сводка." + }, + "integrations": { + "title": "Интеграции", + "body": "Интеграции автоматически синхронизируют Withings, WHOOP, Polar, Oura и Apple Health. Вес, сон и восстановление заполняются без ручного ввода и в свою очередь питают аналитику и Коуча." + }, + "export": { + "title": "Отчёт для врача", + "body": "Отчёт для врача собирает измерения, лекарства, результаты анализов и профилактику в PDF или FHIR для приёма. Здесь сходятся все модули: полный отчёт получается только из хорошо ведущихся данных." + }, + "achievements": { + "title": "Достижения", + "body": "Достижения вознаграждают постоянство: серии и вехи. Небольшой цикл мотивации, который помогает не бросать." + }, + "wrapUp": { + "title": "Это весь тур", + "body": "Этот обзор проходит один раз и сам не откроется снова. Всё, что он показал, остаётся на месте, а функции можно включать и выключать в любое время в разделе Настройки → Модули." + } + } + }, + "shell": { + "back": "Назад", + "skip": "Пропустить", + "next": "Продолжить", + "stepOf": "Шаг {current} из {total}", + "stepsLabel": "Шаги настройки" + }, + "baseline": { + "title": "Немного о вас", + "body": "Четыре необязательных поля уточняют целевые диапазоны, ИМТ и напоминания. Любое из них можно изменить позже в настройках.", + "displayNameLabel": "Отображаемое имя", + "displayNamePlaceholder": "Как HealthLog должен к вам обращаться?", + "displayNameHint": "Показывается в приветствии на сводке и в отчётах.", + "heightLabel": "Рост (см)", + "heightLabelFtIn": "Рост (фут, дюйм)", + "genderLabel": "Пол", + "genderNone": "Предпочитаю не указывать", + "genderMale": "Мужской", + "genderFemale": "Женский", + "genderOther": "Другой", + "dateOfBirthLabel": "Дата рождения", + "dateOfBirthHint": "Используется только для аналитики с учётом возраста." + }, + "done": { + "title": "Всё готово", + "body": "Добро пожаловать. Ваша сводка готова.", + "returnCta": "Открыть сводку", + "learning": "Некоторые данные аналитики (глюкоза, ритм сна, динамика АД, цикл) уточняются в первые одну-две недели по мере накопления данных. Пустые плитки сейчас означают лишь то, что мы всё ещё изучаем ваш базовый уровень.", + "connectCta": "Подключить устройство", + "logCta": "Записать первое измерение", + "importCta": "Импортировать существующую историю", + "modulesCta": "Выбрать модули" + }, + "welcomeBack": { + "title": "С возвращением", + "cta": "Открыть сводку" + }, + "disclaimer": { + "acknowledge": "Я понимаю: HealthLog — это приватный инструмент отслеживания, а не клиническая оценка или диагноз. Если я обеспокоен, я поговорю с врачом, а не с этим приложением.", + "learnMore": "Подробнее" + }, + "anamnesis": { + "title": "О вашем здоровье (необязательно)", + "subtitle": "Немного контекста, чтобы HealthLog точнее читал ваши числа.", + "intro": "Делитесь стольким, скольким хотите. Каждое поле необязательно, и его можно изменить в любое время в настройках.", + "conditionsLabel": "Текущие состояния", + "conditionsPlaceholder": "например, повышенное АД, диабет 2 типа", + "conditionsHint": "Помогает HealthLog рассматривать ваши измерения в контексте, а не отмечать ожидаемое.", + "allergiesLabel": "Аллергии или непереносимости", + "allergiesPlaceholder": "например, пенициллин, лактоза", + "privacyNote": "Хранится в зашифрованном виде и используется только для лучшего контекста. Здесь мы не спрашиваем о ваших лекарствах. Добавляйте их в любое время на странице «Лекарства»." + }, + "ai": { + "panelTitle": "Посмотрите, как выглядит аналитика", + "panelIntro": "Коуч, ежедневная сводка и заметки по каждому показателю превращают ваши числа в понятный язык. Вот как это выглядит, прежде чем вы что-либо подключите.", + "showSample": "Посмотреть пример сводки", + "sampleTitle": "Ежедневная сводка", + "sampleTag": "Пример", + "sampleAriaLabel": "Пример ежедневной сводки", + "sampleBody": "Вес снизился на 1,2 кг за две недели. Пульс в покое стабилен на 58 уд/мин. АД в диапазоне 6 из 7 дней; единственное высокое измерение последовало за поздним солёным ужином.", + "sampleCaption": "Только пример, не ваши данные. Так выглядит сводка, когда аналитика включена.", + "ladderTitle": "Три способа включить", + "ladderLocalTitle": "Локальная модель: запросы ИИ остаются в вашей сети", + "ladderLocalBody": "Направьте HealthLog на Ollama или LM Studio на вашей машине. Бесплатно и полностью приватно — спокойный выбор по умолчанию.", + "ladderByokTitle": "Свой ключ", + "ladderByokBody": "Используйте свой ключ OpenAI или Anthropic. Он работает под вашим аккаунтом и оплатой, а API-тариф по умолчанию не использует ваши данные для обучения.", + "ladderOauthTitle": "Вход по подписке", + "ladderOauthBody": "Подключите аккаунт ChatGPT. Без оплаты за токены, но условия потребительского тарифа могут использовать контент для обучения, поэтому это осознанный выбор, а не значение по умолчанию для ваших данных о здоровье.", + "keylessLine": "HealthLog полностью полезен и без ИИ. Ваши плитки, графики, динамика и экспорт работают. ИИ лишь добавляет понятное описание сверху.", + "setupCta": "Настроить (около минуты)", + "sharedKeyNote": "Этот экземпляр уже предоставляет общий провайдер ИИ, поэтому аналитика работает у вас прямо сейчас, без настройки.", + "offer": { + "title": "Этот экземпляр может написать вашу сводку понятным языком.", + "body": "Оператор предоставляет провайдера, который последний раз работал в течение последних 24 часов. Одно нажатие включает понятное описание; ваши данные затем уходят только этому провайдеру и никому больше.", + "cta": "Включить понятный язык", + "granted": "Включено. Первая сводка появится на вашей сводке.", + "error": "Включить не удалось. Попробуйте ещё раз через минуту." + }, + "unavailable": { + "title": "Провайдер этого экземпляра сейчас не отвечает.", + "body": "HealthLog полностью полезен и без понятного описания. Вы можете добавить своего провайдера позже в настройках." + } + }, + "steps": { + "who": "Для кого эта запись", + "areas": "За чем следить", + "medication": "Лекарства", + "sources": "Откуда берутся измерения", + "visit": "Визит к врачу", + "units": "Единицы", + "confirm": "Подтвердить", + "first-result": "Первый результат", + "done": "Готово" + }, + "flow": { + "welcome": { + "title": "Добро пожаловать в HealthLog", + "body": "Пять коротких вопросов определяют, что HealthLog покажет вам первым. Это занимает около двух минут.", + "changeLater": "Ничего не окончательно: любой выбор можно изменить позже в настройках.", + "setUp": "Настроить", + "skip": "Пропустить пока", + "againBody": "Ваша настройка завершена. Ответьте на вопросы снова, чтобы изменить, что HealthLog показывает первым, или перейдите к сводке.", + "setUpAgain": "Настроить снова" + }, + "who": { + "title": "Для кого эта запись?", + "body": "Следующие ответы относятся к этой записи.", + "options": { + "me": "Для меня", + "someone-else": "За кем я ухаживаю", + "both": "И то и другое" + }, + "hints": { + "someone-else": "Например, ребёнок или родитель. Их профиль создаётся в конце.", + "both": "Настройте свою запись сейчас; профиль для другого человека будет предложен в конце." + } + }, + "areas": { + "title": "За чем вы хотите следить?", + "body": "Выберите любое количество. Это определяет, какие модули включены и что сводка показывает первым.", + "options": { + "blood-pressure": "АД", + "weight-body": "Вес и тело", + "glucose": "Глюкоза крови", + "sleep": "Сон и восстановление", + "mood": "Настроение и психическое благополучие", + "cycle": "Цикл", + "activity": "Активность и тренировки", + "labs": "Результаты анализов", + "illness": "Заболевания и симптомы" + } + }, + "medication": { + "title": "Принимаете ли вы лекарства по расписанию?", + "body": "Расписание включает модуль лекарств и напоминания.", + "options": { + "yes": "Да", + "no": "Нет", + "sometimes": "Иногда" + } + }, + "sources": { + "title": "Откуда сегодня берутся ваши измерения?", + "body": "Выберите любое количество. В конце будет предложено одно подключение; ни одно не обязательно.", + "options": { + "manual": "Я ввожу их вручную", + "apple-health": "Apple Health на моём iPhone", + "withings": "Withings", + "oura": "Oura", + "whoop": "WHOOP", + "polar": "Polar", + "fitbit": "Fitbit", + "strava": "Strava", + "nightscout": "Nightscout", + "file": "Файл, который у меня уже есть" + }, + "hints": { + "apple-health": "Синхронизируется приложением iOS или импортируется из экспорта.", + "file": "Импортируется в настройках, когда вы здесь закончите." + } + }, + "visit": { + "title": "Предстоит ли визит к врачу?", + "body": "Визит включает отчёт для врача и добавляет подготовку к нему в ваш список.", + "options": { + "within-a-month": "Да, в течение месяца", + "later": "Позже", + "no": "Нет" + } + }, + "units": { + "title": "Какие единицы вы используете?", + "body": "Измерения хранятся один раз и показываются в выбранных вами единицах. Их можно изменить позже в настройках.", + "glucoseLegend": "Глюкоза крови", + "weightLegend": "Вес и рост", + "options": { + "metric": "кг и см", + "imperial": "фунты и фут/дюйм" + } + }, + "confirm": { + "title": "Вот что включают ваши ответы", + "body": "Один взгляд, и HealthLog настроен. Ничего здесь не окончательно.", + "modulesTitle": "Модули", + "switchedOn": "Включено: {modules}.", + "nothingExtra": "Ваши ответы не включают дополнительных модулей; основные измерения всегда на месте.", + "alwaysOn": "Всегда включено: {modules} и основные измерения (вес, АД, пульс).", + "everythingElse": "Всё остальное остаётся в одном клике в разделе", + "modulesLink": "Настройки, Модули", + "switchesOff": "Вне навигации: {modules}. Любой из них можно снова включить в разделе Настройки, Модули.", + "glucoseUnit": "Глюкоза крови", + "unitPreference": "Единицы", + "language": "Язык", + "timezone": "Часовой пояс", + "changeInSettings": "Изменить это в разделе Настройки, Аккаунт", + "cta": "Подтвердить и продолжить", + "managedTitle": "Человек, за которым вы ухаживаете", + "managedBody": "У их записи нет собственного входа; вы ведёте её из своего аккаунта. Для её создания нужен второй фактор или ключ доступа на вашем аккаунте.", + "managedCreate": "Создать профиль и завершить", + "managedLater": "Вы также можете создать его позже в разделе Настройки, Общий доступ.", + "finishWithoutProfile": "Завершить без профиля" + }, + "first-result": { + "connect-source": { + "title": "Подключить {target}", + "body": "Одно подключение, выбранное по вашим ответам. Затем измерения будут поступать сами.", + "howTo": "Подключение к {target} выполняется на странице интеграций. Вернитесь сюда afterwards; этот экран заметит, когда всё будет готово.", + "cta": "Подключить {target}", + "checking": "Проверка подключения.", + "waiting": "Пока не подключено.", + "openSettings": "Открыть Настройки → Интеграции", + "noDate": "неизвестно", + "needsCredentials": { + "title": "В этом экземпляре пока нет приложения {target}.", + "detail": "Введите свои учётные данные в разделе Настройки → Интеграции, и подключение сможет начаться." + }, + "state": { + "pending_first_sync": { + "title": "{target} подключён.", + "detail": "Идёт первая синхронизация. Измерения появятся на сводке по мере поступления." + }, + "fresh": { + "title": "{target} уже подключён.", + "detail": "Последнее измерение {when}. Здесь больше ничего делать не нужно." + }, + "stale": { + "title": "{target} подключён, но сейчас ничего не поступает.", + "detail": "Последнее измерение {when}. Само подключение в порядке." + }, + "stalled": { + "title": "{target} подключён, но синхронизация остановилась.", + "detail": "Последняя попытка {when}. Проверьте подключение в разделе Настройки → Интеграции." + }, + "failing": { + "title": "{target} подключён, но синхронизация постоянно сбоит.", + "detail": "С {when} ничего не поступало. Проверьте подключение в разделе Настройки → Интеграции." + }, + "reauth_required": { + "title": "Подключение к {target} нужно обновить.", + "detail": "Войдите ещё раз, и измерения продолжатся." + }, + "parked": { + "title": "Подключение к {target} приостановлено.", + "detail": "Проверьте подключение в разделе Настройки → Интеграции." + } + } + }, + "add-medication": { + "title": "Добавьте первое лекарство", + "body": "Название, доза и расписание; напоминание следует заданному расписанию.", + "howTo": "Лекарство добавляется за несколько коротких шагов. Больше можно добавить позже на странице лекарств.", + "cta": "Добавить лекарство", + "done": "{name} добавлено.", + "doneUnnamed": "Ваше первое лекарство добавлено.", + "nextDose": "Следующая доза: {when}.", + "reminders": "Напоминания следуют заданному расписанию.", + "recordOnly": "Хранится как запись: без напоминаний, ничего не наступает.", + "asNeeded": "По потребности: без напоминаний, записывайте дозу, когда принимаете." + }, + "log-reading": { + "title": "Введите одно измерение: {target}", + "body": "Одно измерение помещает первое значение на вашу сводку. Динамика рисуется с пятого.", + "done": "Ваше первое измерение на своей плитке.", + "doneElsewhere": "Ваша первая запись для {target} сохранена.", + "elsewhere": "У {target} есть собственная страница. Откройте её, сделайте первую запись, затем вернитесь и отметьте готово.", + "open": "Открыть {target}", + "markDone": "Я сделал запись" + } + }, + "done": { + "tourCta": "Пройти короткий тур", + "openRecord": "Открыть запись {name}", + "createProfile": "Создать профиль для человека, за которым вы ухаживаете" + } + } + }, + "gettingStarted": { + "title": "Начало работы", + "subtitle": "Быстрые шаги, чтобы получить максимум от HealthLog.", + "progress": "{done} из {total} выполнено", + "dismissAll": "Скрыть список", + "dismissTooltip": "Скрыть этот пункт", + "items": { + "profileTitle": "Заполните профиль", + "profileDescription": "Рост, дата рождения и пол открывают персонализированные цели.", + "profileCta": "Открыть профиль", + "measurementTitle": "Запишите первое измерение", + "measurementDescription": "Одно измерение открывает плитку; сама динамика рисуется с 5-го измерения.", + "measurementCta": "Добавить измерение", + "medicationTitle": "Добавьте лекарство", + "medicationDescription": "Отслеживайте приверженность и получайте напоминания именно тогда, когда нужно.", + "medicationCta": "Добавить лекарство", + "dataSourceTitle": "Подключите источник данных (необязательно)", + "dataSourceDescription": "Автосинхронизация веса, АД, сна и другого из Withings, WHOOP, Oura, Polar, Nightscout, Fitbit или Apple Health.", + "dataSourceCta": "Подключить", + "notificationsTitle": "Настройте уведомления", + "notificationsDescription": "Выберите, как HealthLog должен напоминать вам: Telegram, ntfy или Web Push.", + "notificationsCta": "Открыть уведомления", + "insightsTitle": "Включите аналитику (необязательно)", + "insightsDescription": "Добавьте локальную модель или свой ключ ИИ, чтобы открыть ежедневную сводку и Коуча.", + "insightsCta": "Включить аналитику", + "visitTitle": "Подготовьтесь к визиту", + "visitDescription": "Поставьте приём в календарь; отчёт для врача соберёт то, что нужно взять.", + "visitCta": "Открыть визиты", + "dataSourceNamedTitle": "Подключить {source}", + "managedProfileTitle": "Создайте профиль, за которым вы ухаживаете", + "managedProfileDescription": "Ваши ответы были даны для записи другого человека; она создаётся в разделе Общий доступ.", + "managedProfileCta": "Создать профиль" + } + }, + "trendHints": { + "title": "Первая динамика после 5 измерений", + "remainingOne": "Осталось 1 измерение.", + "remainingMany": "Осталось измерений: {count}." + }, + "settings": { + "oauthCallbackPreflightItem": "{provider}: адрес обратного вызова {configuredOrigin} отличается от адреса этого приложения {currentOrigin}.", + "shell": { + "sectionsNav": "Разделы настроек", + "groups": { + "account": "Аккаунт", + "yourData": "Ваши данные", + "healthProfile": "Профиль здоровья", + "ai": "ИИ", + "connectivity": "Связность", + "system": "Система", + "tracking": "Отслеживание", + "arrangement": "Расположение", + "notifications": "Уведомления", + "connections": "Подключения", + "data": "Данные" + }, + "allSections": "Все разделы" + }, + "sharedRecord": { + "managedSettings": { + "saveError": "Не удалось сохранить. Попробуйте ещё раз.", + "validationError": "Проверьте введённые данные.", + "profile": { + "title": "Профиль", + "displayName": "Отображаемое имя", + "height": "Рост (см)", + "dateOfBirth": "Дата рождения", + "gender": "Пол", + "notSpecified": "Не указан", + "male": "Мужской", + "female": "Женский", + "other": "Другой", + "locale": "Локаль", + "systemDefault": "Системная по умолчанию", + "timezone": "Часовой пояс", + "units": "Единицы", + "metric": "Метрические", + "imperial": "Имперские", + "timeFormat": "Формат времени", + "automatic": "Автоматически", + "hour12": "12-часовой", + "hour24": "24-часовой", + "dateFormat": "Формат даты", + "dateDmy": "День / месяц / год", + "dateMdy": "Месяц / день / год", + "dateYmd": "Год / месяц / день" + }, + "modules": { + "title": "Модули" + }, + "notifications": { + "title": "Уведомления", + "moodReminder": "Включить напоминание о настроении", + "reminderHour": "Час напоминания о настроении", + "lowStockRunwayDays": "Дни запаса для низкого остатка", + "reorderLeadDays": "Дни до повторного заказа" + }, + "thresholds": { + "title": "Цели", + "metric": "Показатель", + "minimum": "Минимум", + "maximum": "Максимум" + }, + "coach": { + "title": "Тренер", + "disable": "Отключить Коуча", + "tone": "Тон", + "warm": "Тёплый", + "neutral": "Нейтральный", + "concise": "Краткий", + "verbosity": "Подробность", + "brief": "Кратко", + "default": "По умолчанию", + "detailed": "Подробно", + "excludedMetrics": "Исключённые показатели", + "dataClusters": "Кластеры данных", + "customClusters": "Использовать свой выбор кластеров", + "metrics": { + "bp": "АД", + "weight": "Вес", + "pulse": "Пульс", + "mood": "Настроение", + "compliance": "Приверженность приёму лекарств", + "hrv": "Вариабельность сердечного ритма", + "sleep": "Сон", + "restingHr": "ЧСС в покое", + "steps": "Шаги", + "medications": "Лекарства", + "anthropometrics": "Измерения тела" + }, + "clusters": { + "cardio": "Сердечно-сосудистое здоровье", + "body": "Состав тела", + "activity": "Активность", + "workouts": "Тренировки", + "sleep": "Сон", + "mood": "Настроение", + "glucose": "Глюкоза", + "medication": "Лекарства", + "mobility": "Мобильность", + "environment": "Окружение" + } + }, + "insights": { + "title": "Аналитика", + "sections": "Разделы обзора", + "tiles": "Навигационные плитки", + "order": "Порядок", + "unknownItem": "Недоступная аналитика", + "sectionLabels": { + "wellnessScores": "Оценки самочувствия", + "dailyBriefing": "Ежедневная сводка", + "vitals": "Показатели", + "trends": "Динамика", + "periodReview": "Обзор периода", + "cycleSummary": "Сводка цикла", + "signals": "Сигналы", + "rhythmEvents": "События ритма", + "healthStatus": "Состояние здоровья", + "breathing": "Дыхание", + "labsChanges": "Изменения анализов", + "ecg": "ЭКГ" + } + } + }, + "unavailableTitle": "Недоступно в этой общей записи", + "unavailableDescription": "Этот раздел настроек намеренно недоступен при просмотре записи другого человека.", + "integrationStatusDescription": "Статус подключения для этой управляемой записи.", + "integrationStatusDetail": "Сервисы, которые вы подключаете здесь, отправляют свои данные в запись {name}, а не в вашу. Без собственного приложения провайдера профиль использует ваше.", + "integrationStatusDocs": "Как работает общий доступ", + "integrationConnectsFor": "Подключается для {name}", + "integrationConnectFor": "Подключить для {name}", + "integrationDisconnect": "Отключить", + "integrationDisconnectTitle": "Отключить {provider} от {name}?", + "integrationDisconnectBody": "Новые данные перестанут поступать. Всё уже импортированное останется в записи {name}.", + "integrationNoClientApp": "Ни у {name}, ни у вашего аккаунта пока нет приложения {provider}. Сначала настройте его в своих интеграциях.", + "integrationConnectFailed": "Не удалось начать подключение {provider}." + }, + "sections": { + "account": { + "title": "Аккаунт", + "subtitle": "Ваш профиль, личность и данные для входа." + }, + "integrations": { + "title": "Интеграции", + "subtitle": "Подключайте и управляйте источниками данных и устройствами.", + "connectionsHeading": "Подключения", + "channelsHeading": "Каналы доставки", + "channelsDescription": "Куда доставляются напоминания и оповещения.", + "matrixLink": "Уведомления по каналам" + }, + "notifications": { + "title": "Уведомления", + "subtitle": "Выберите, какие напоминания вы получаете и куда они доставляются.", + "remindersHeading": "Напоминания", + "matrixLink": "Уведомления по каналам", + "channelsLink": "Каналы доставки", + "displayHeading": "На вашем телефоне", + "elsewhere": { + "title": "Настройте там, где им место", + "description": "Эти напоминания настраиваются рядом с тем, к чему они относятся.", + "doses": { + "title": "Дозы лекарств", + "description": "Время приёма и напоминания каждого лекарства задаются на самом лекарстве.", + "link": "Открыть лекарства" + }, + "cycle": { + "title": "Цикл", + "description": "Напоминания о менструации и фертильном окне включаются по каналам в матрице уведомлений.", + "link": "Открыть матрицу уведомлений" + } + } + }, + "layout": { + "title": "Расположение", + "backToHub": "Назад к расположению", + "dashboard": { + "title": "Сводка", + "description": "Расположение и порядок плиток." + }, + "insights": { + "title": "Аналитика", + "description": "Разделы обзора и порядок навигационных чипов." + }, + "subtitle": "Выберите порядок и вид сводки, аналитики и списков отслеживания.", + "medications": { + "title": "Лекарства", + "description": "Вид списка и ручной порядок." + }, + "labs": { + "title": "Анализы", + "description": "Вид, сортировка и ручной порядок." + }, + "illness": { + "title": "Дневник болезней", + "description": "Вид списка и порядок эпизодов." + }, + "vorsorge": { + "title": "Профилактика", + "description": "Вид списка и порядок напоминаний." + }, + "documents": { + "title": "Документы", + "description": "Вид и расположение по месяцам." + } + }, + "dashboard": { + "subtitle": "Расположите плитки на вашей сводке." + }, + "thresholds": { + "title": "Цели", + "subtitle": "Задайте свои целевые диапазоны по показателям." + }, + "sources": { + "title": "Приоритет источников", + "integrationsHint": "Подключайте и отключайте источники данных на странице интеграций.", + "integrationsHintLink": "Открыть интеграции", + "cardTitle": "Ранжирование по показателям", + "help": "Когда несколько источников передают одно и то же значение в один день, верхний источник считается каноническим.", + "resetDefaults": "Сбросить к значениям по умолчанию", + "resetDefaultsTitle": "Сбросить порядок источников?", + "resetDefaultsBody": "Каждая настроенная вами лестница вернётся к порядку по умолчанию сразу для всех показателей и типов устройств. Это сохраняется немедленно, и вернуть прежнее нельзя.", + "resetDefaultsConfirm": "Сбросить порядок", + "moveUp": "Вверх", + "moveDown": "Вниз", + "saveSuccess": "Приоритет источников сохранён", + "saveError": "Не удалось сохранить приоритет источников.", + "resetSuccess": "Приоритет источников сброшен к значениям по умолчанию", + "perMetricToggle": "Переопределения по показателям ({count})", + "perMetricHelp": "Показатели, которые вы настроили иначе, чем по умолчанию. Используйте этот список, чтобы вернуть любой отдельный показатель к его постоянному значению по умолчанию, не трогая остальные.", + "perMetricEmpty": "Переопределений по показателям нет. Каждый показатель использует глобальную лестницу выше.", + "resetMetric": "Сбросить", + "deviceTypeToggle": "Приоритет типов устройств ({count})", + "deviceTypeHelp": "Внутри источника — какое устройство побеждает. Когда Apple Watch и iPhone оба записывают шаги, тип устройства с более высоким рангом считается каноническим измерением.", + "deviceTypeDefault": "Лестница типов устройств по умолчанию", + "resetDeviceTypes": "Сбросить типы устройств", + "metrics": { + "steps": "Шаги", + "activeEnergy": "Активная энергия", + "walkingRunningDistance": "Расстояние ходьбы + бега", + "flightsClimbed": "Этажи", + "sleep": "Сон", + "weight": "Вес", + "bloodPressure": "АД", + "pulse": "Пульс", + "bodyFat": "Жировая масса", + "bodyTemperature": "Температура тела", + "spo2": "Насыщение кислородом", + "hrv": "Вариабельность сердечного ритма", + "restingHeartRate": "ЧСС в покое", + "vo2Max": "VO2 max", + "skinTemperature": "Температура кожи", + "respiratoryRate": "Частота дыхания", + "recovery": "Восстановление", + "stress": "Стресс", + "sleepDebt": "Дефицит сна", + "hrvRmssd": "HRV (RMSSD)" + }, + "sourceLabels": { + "WITHINGS": "Withings", + "APPLE_HEALTH": "Apple Health", + "MANUAL": "Ручной ввод", + "IMPORT": "Импорт", + "WHOOP": "WHOOP", + "FITBIT": "Fitbit", + "COMPUTED": "Вычислено", + "NIGHTSCOUT": "Nightscout", + "POLAR": "Polar", + "OURA": "Oura", + "TELEGRAM": "Telegram", + "MCP": "MCP", + "GOOGLE_HEALTH": "Google Health", + "STRAVA": "Strava", + "EXTERNAL": "Внешнее устройство", + "HEALTH_CONNECT": "Health Connect" + }, + "deviceLabels": { + "watch": "Часы", + "band": "Браслет", + "ring": "Кольцо", + "phone": "Телефон", + "scale": "Весы", + "other": "Другое", + "unknown": "Неизвестно" + }, + "subtitle": "Решите, какой источник побеждает, когда два сообщают один и тот же показатель.", + "nutrients": { + "title": "Синхронизированный приём нутриентов", + "description": "Дневные итоги за последние {days} дней: что синхронизировал Apple Health плюс принятые вами добавки.", + "empty": "Данные о нутриентах ещё не синхронизированы.", + "latest": "{amount} {unit} {date}", + "daysWithData": "{count} из {days} дней", + "moduleHint": "Синхронизацией управляет модуль приёма нутриентов.", + "moduleHintLink": "Управлять модулями", + "detail": "Только чтение: числами владеет приложение-источник." + }, + "helpDetail": "Остальные остаются сохранёнными для аудита. Перечислены только источники, которые вы подключили или от которых есть данные.", + "noneInUse": "Пока нет источника для ранжирования. Подключите его в разделе «Интеграции» или запишите значение." + }, + "ai": { + "title": "Провайдер ИИ", + "subtitle": "Выберите провайдера ИИ и используйте свой ключ." + }, + "api": { + "title": "API и токены", + "subtitle": "Управляйте эндпоинтами API и токенами доступа." + }, + "advanced": { + "title": "Дополнительно", + "subtitle": "Сброс данных и удаление аккаунта." + }, + "export": { + "title": "Экспорт и импорт", + "otherOptionsHeading": "Другие варианты экспорта", + "downloadFailed": "Не удалось скачать экспорт. Попробуйте ещё раз.", + "actions": { + "download": "Скачать" + }, + "filters": { + "since": "С", + "until": "По" + }, + "cards": { + "measurementsCsv": { + "title": "Измерения", + "description": "Вес, АД, пульс, глюкоза и все остальные измерения в виде значений, разделённых запятыми." + }, + "medicationsCsv": { + "title": "Лекарства", + "description": "Ваш список лекарств с дозировкой, расписаниями и (по желанию) полной историей приёмов.", + "includeIntake": "Включить историю приёмов" + }, + "moodCsv": { + "title": "Настроение", + "description": "Ежедневные записи настроения с баллом, тегами и отметками времени." + }, + "fullBackup": { + "title": "Полная резервная копия", + "description": "Вся ваша запись в одном JSON-файле.", + "scopeNote": "Метаданные документов и сгенерированная ИИ сводка, если она есть, включаются как обычный текст; исходные файлы документов и GPS/выборочные данные тренировок — нет. Скачивайте их отдельно из хранилища или экспорта тренировок.", + "encryptToggle": "Зашифровать парольной фразой", + "passphrasePlaceholder": "Парольная фраза (мин. 12 символов)", + "passphraseHelp": "Выводит ключ архива с помощью Argon2id и запечатывает его AES-256-GCM. Сохраните файл с расширением .hlx.", + "noRecoveryWarning": "Восстановления нет. Если вы потеряете эту парольную фразу, архив нельзя будет открыть. Храните её в надёжном месте.", + "detail": "Переносимая копия вашей записи для хранения и чтения: значения в обычном JSON, документы только как метаданные. Это не еженедельная копия аккаунта, которую сервер хранит для отката аккаунта, и она не может воссоздать аккаунт на другом сервере. Некоторые типы записей пока не переносятся; манифест файла перечисляет, что в нём есть.", + "contents": "Ваши измерения, лекарства, настроение, цикл, анализы, эпизоды болезней, аллергии, семейный анамнез, нутриенты, тренировки, профиль здоровья и свои показатели в одном JSON-файле." + } + }, + "import": { + "heading": "Импорт", + "description": "Переносите данные в HealthLog из экспорта Apple Health, JSON-файла или CSV. Импорт пропускает уже существующие строки, поэтому повторный запуск безопасен.", + "charCount": "{used} / {max} символов", + "appleHealth": { + "title": "Apple Health", + "description": "Загрузите export.zip из приложения «Здоровье» на iPhone (Профиль → Экспортировать все данные о здоровье).", + "dropLabel": "Перетащите export.zip сюда", + "dropHint": "или нажмите, чтобы выбрать файл", + "fileInputLabel": "Выберите файл export.zip Apple Health", + "choose": "Выбрать файл", + "idempotencyNote": "Повторная загрузка того же архива объединяет его и не создаёт дубликатов. Большие архивы обрабатываются в фоне.", + "uploading": "Загрузка…", + "uploadFailed": "Загрузка не удалась. Попробуйте ещё раз.", + "rateLimited": "Слишком много загрузок. Подождите немного и попробуйте ещё раз.", + "tooLarge": "Этот файл слишком большой (лимит 1,5 ГБ).", + "failed": "Импорт не удался.", + "failureInterrupted": "Импорт был прерван до завершения, обычно из-за перезапуска сервера или остановки из-за нехватки памяти. Ваши данные в безопасности; загрузите экспорт снова, чтобы повторить.", + "failureInsufficientMemory": "Лимит памяти сервера слишком мал для архива такого размера. Попросите того, кто управляет сервером, поднять лимит кучи Node.js (NODE_OPTIONS=--max-old-space-size), затем загрузите экспорт снова.", + "rowsImported": "Импортировано строк на данный момент: {count}", + "doneSummary": "Готово: импортировано {imported} из {read} записей, пропущено {skipped} клинических записей.", + "doneNothing": "Из этого архива ничего не импортировано: 0 из {read} записей сохранено.", + "writtenByHealthLogOne": "{count} запись, которую HealthLog сам записал в Apple Health, была исключена, потому что она уже есть в ваших данных.", + "writtenByHealthLogOther": "{count} записей, которые HealthLog сам записал в Apple Health, были исключены, потому что они уже есть в ваших данных.", + "writtenByHealthLogFew": "{count} записи, которые HealthLog сам записал в Apple Health, были исключены, потому что они уже есть в ваших данных.", + "ecgResult": "ЭКГ: обнаружено {discovered}, импортировано {imported}, обновлено {updated}, пропущено {skipped}, с ошибкой {failed}. Сбои ЭКГ не отбрасывают поддерживаемые записи, импортированные из export.xml.", + "estimateWarning": "Накопительные итоги за {count} день(дней) были оценены по крупнейшему источнику экспорта. Собственная статистика Apple Health остаётся авторитетной.", + "phase": { + "queued": "В очереди…", + "unpacking": "Распаковка архива…", + "parsing": "Чтение экспорта…", + "upserting": "Импорт записей…" + }, + "skipUnsupported": "Пропущено образцов: {count}: типы данных, которые HealthLog не импортирует.", + "skipRefused": "{count} образцов не удалось записать (нечитаемые, вне диапазона или сохранение не удалось).", + "skipBreakdown": "Показать разбивку ({count} типов)", + "skipBreakdownMore": "+ ещё {count} типов", + "cycleSummary": "{samples} образцов цикла объединены в {days} дневных записей.", + "cycleModuleOff": "{count} образцов цикла пропущено, потому что отслеживание цикла выключено для этого аккаунта.", + "cycleDaysFailed": "{count} дней цикла не удалось записать: {reason}" + }, + "json": { + "title": "Измерения и настроение (JSON)", + "description": "Вставьте JSON или загрузите .json-файл с измерениями и записями настроения.", + "pasteLabel": "Вставить JSON", + "fileInputLabel": "Выберите JSON-файл для импорта", + "schemaHint": "Два массива: measurements и moodEntries.", + "docsLink": "Посмотреть схему и пример.", + "uploadFile": "Загрузить файл", + "downloadExample": "Скачать пример", + "import": "Импорт", + "invalidJson": "Это не корректный JSON. Проверьте синтаксис и попробуйте ещё раз.", + "invalidPayload": "Данные не соответствуют схеме импорта.", + "rateLimited": "Слишком много импортов за этот час (лимит 5). Попробуйте позже.", + "failed": "Импорт не удался. Попробуйте ещё раз.", + "readFailed": "Не удалось прочитать этот файл.", + "resultSummary": "Импортировано измерений: {measurements}, записей настроения: {moods}, пропущено: {skipped}.", + "resultSuccess": "Импортировано измерений: {measurements}, записей настроения: {moods}", + "droppedLinks": "Импортировано без этих тегов, потому что в этом аккаунте нет тегов с такими названиями: {keys}", + "keptLabels": "В этом аккаунте уже есть теги или группы с этими ключами под своими названиями, поэтому они сохранены: {keys}", + "resultNothing": "Ничего не импортировано. Все записи пропущены: {skipped}.", + "resultEmpty": "В этом файле не было ни измерений, ни записей настроения.", + "limitsHint": "До {mb} МБ и до {rows} записей в каждом списке. Записи добавляются в вашу историю; полная резервная копия не восстанавливается." + }, + "csv": { + "title": "Файл CSV", + "description": "Импортируйте измерения из таблицы или экспорта прибора.", + "pasteLabel": "Вставьте CSV", + "fileInputLabel": "Выберите файл CSV для импорта", + "schemaHint": "Столбцы: type, value, unit, measuredAt (со смещением часового пояса) и необязательные glucoseContext, notes, externalId.", + "docsLink": "Схема столбцов и пример.", + "uploadFile": "Загрузить файл", + "downloadExample": "Скачать пример", + "preview": "Предпросмотр", + "import": "Импорт", + "empty": "Добавьте хотя бы одну строку CSV перед импортом.", + "rateLimited": "Слишком много импортов за этот час (лимит 5). Попробуйте позже.", + "tooLarge": "Файл слишком большой (лимит 16 МБ).", + "invalidPayload": "Не удалось разобрать CSV. Проверьте строку заголовков и попробуйте снова.", + "failed": "Импорт не удался. Попробуйте снова.", + "readFailed": "Не удалось прочитать этот файл.", + "previewSummary": "Предпросмотр: будет импортировано {inserted}, пропущено {skipped}.", + "resultSummary": "Импортировано новых: {inserted}, обновлено: {updated}, пропущено: {skipped}.", + "rowError": "Строка {line}: {reason}", + "resultSuccess": "Импортировано новых: {inserted}, обновлено: {updated}", + "resultNothing": "Ничего не импортировано. Все строки пропущены: {skipped}.", + "resultEmpty": "В этом файле есть заголовок, но нет строк с данными.", + "previewSuccess": "Предпросмотр: будет импортировано {inserted}", + "previewNothing": "Предпросмотр: ничего не будет импортировано. Все строки будут пропущены: {skipped}.", + "skipGroupOne": "Пропущена {count} строка: {reason}", + "skipGroupFew": "Пропущено {count} строки: {reason}", + "skipGroupOther": "Пропущено {count} строк: {reason}", + "skipDetails": "Показать все пропущенные строки", + "reasonUnknownType": "неизвестный тип измерения", + "reasonInvalidValue": "значение не является числом", + "reasonValueOutOfRange": "значение вне допустимого диапазона", + "reasonUnknownUnit": "единица не распознана для этого типа", + "reasonMissingTimezoneOffset": "у отметки времени нет смещения часового пояса", + "reasonInvalidTimestamp": "не удалось прочитать отметку времени", + "reasonImplausibleTimestamp": "отметка времени в будущем или раньше 1900 года", + "reasonUnexpectedGlucoseContext": "контекст глюкозы указан в строке, которая не является глюкозой крови", + "reasonInvalidGlucoseContext": "контекст глюкозы не входит в список допустимых значений", + "reasonNotesTooLong": "заметка слишком длинная", + "reasonExternalIdTooLong": "внешний ID слишком длинный", + "reasonUnstableExternalId": "внешний ID нестабилен между экспортами", + "reasonDuplicate": "уже импортировано", + "reasonUnknown": "пропущено", + "detail": "Одна строка на измерение." + }, + "doseHistory": { + "title": "История доз лекарств", + "description": "История доз, экспортированная из другого трекера лекарств, читается как есть.", + "pasteLabel": "Вставьте экспорт", + "fileInputLabel": "Выберите файл экспорта истории доз", + "uploadFile": "Выбрать файл", + "preview": "Предпросмотр", + "import": "Импорт", + "empty": "Сначала вставьте экспорт или выберите файл.", + "readFailed": "Не удалось прочитать этот файл.", + "rateLimited": "Не более 5 импортов в час. Попробуйте позже.", + "tooLarge": "Файл превышает лимит 16 МБ.", + "inProgress": "Импорт истории доз уже выполняется. Дождитесь его завершения.", + "workerUnavailable": "Фоновый обработчик недоступен, поэтому ничего не импортировано.", + "failed": "Импорт не удался. Ничего не записано.", + "columnsHeading": "Что делает каждый столбец", + "jsonOnly": "Только JSON", + "previewLine": "Прочитано строк: {rows}, будет импортировано: {queued}, отклонено: {refused}", + "submittedLine": "Прочитано строк: {rows}, поставлено в очередь на импорт: {queued}", + "unmatched": "Нет совпадений с лекарствами в истории: {names}", + "ambiguous": "Совпадает с несколькими лекарствами: {names}", + "mirrored": "Зеркалировано из другого приложения, поэтому дозу добавить нельзя: {names}", + "unknownColumns": "Столбцы, для которых у импортёра нет правила, оставлены непрочитанными: {names}", + "codingsNotRead": "Строки со значением Codings, которое не было прочитано: {count}", + "archivedRowsPresent": "Строки, помеченные как относящиеся к архивным лекарствам: {count}. Этот флаг их не пропускает и не реактивирует; итоговый результат сообщает, что было добавлено.", + "verdict": { + "honoured": "использовано", + "reported": "сообщено", + "ignored": "не прочитано" + }, + "column": { + "date": "Время, когда доза была фактически принята. Смещение UTC читается точно как записано.", + "scheduledDate": "Слот, к которому относилась доза, отдельно от времени приёма. Пустое значение означает, что доза не относилась ни к какому слоту.", + "medication": "Сопоставляется с лекарством, уже имеющимся в вашей истории. Из файла ничего не создаётся.", + "nickname": "Пробуется как второе имя, если первое ни с чем не совпало.", + "dosage": "Записывается в дозу, только если отличается от запланированного количества.", + "scheduledDosage": "Сравнивается с фактическим количеством, чтобы определить, отклонялась ли эта доза. Само по себе не сохраняется.", + "unit": "Записывается вместе с количеством, как указано в файле. \"count\" означает кратность настроенной дозе.", + "status": "\"Taken\" становится дозой, а \"Skipped\" — намеренным пропуском. Любое другое значение не фиксирует решение, и строка отклоняется.", + "archived": "Учитывается и сообщается в результате. Принятая доза не отменяется последующей архивацией лекарства.", + "codings": "Для этого столбца в CSV нет документированной кодировки, поэтому он оставлен как есть, а не угадывается. Заполненные ячейки учитываются.", + "form": "Описывает лекарство, а не дозу.", + "start": "Дата начала приёма лекарства, а не время этой дозы.", + "end": "Дата окончания приёма лекарства, а не время этой дозы." + }, + "fatal": { + "emptyFile": "В этом файле нет строк.", + "missingColumns": "В этом файле отсутствует нужный импортёру столбец: Date, Medication или Status.", + "unreadableJson": "Этот файл не является корректным JSON.", + "jsonNotAnArray": "В этом JSON нет списка доз.", + "jsonNoIntakeTime": "Экспорт JSON фиксирует, когда доза была должна быть принята, но не когда она была принята, а запланированное время не будет записано как время приёма. Экспортируйте вместо этого CSV, в котором есть и то и другое.", + "tooManyRows": "В этом файле больше строк, чем может принять один импорт. Разделите его и импортируйте части." + }, + "detail": "Один файл охватывает все лекарства в нём." + }, + "healthConnect": { + "title": "Экспорт Health Connect", + "description": "Импортируйте ZIP-файл, который создаёт приложение Health Connect на Android при экспорте ваших данных.", + "choose": "Выберите ZIP-файл", + "uploading": "Загрузка…", + "uploadFailed": "Загрузка не удалась. Попробуйте снова.", + "tooLarge": "Файл больше, чем принимает этот сервер.", + "doneSummary": "Импортировано значений: {count}.", + "failed": "Импорт не удался: {reason}", + "phase": { + "queued": "Ожидание запуска", + "unpacking": "Распаковка файла", + "parsing": "Чтение записей", + "upserting": "Сохранение значений", + "done": "Завершено", + "failed": "Ошибка" + }, + "steps": { + "export": "На телефоне Android откройте Health Connect, перейдите в «Управление данными», затем в «Экспорт и импорт» и запустите экспорт.", + "cloud": "Health Connect сохраняет экспорт только в приложение облачного хранилища, например Google Drive, Dropbox или Nextcloud, но никогда на сам телефон. Выберите его там.", + "upload": "Скачайте ZIP-файл из этого облака на это устройство и загрузите его здесь." + }, + "dropLabel": "Перетащите ZIP-файл Health Connect сюда", + "dropHint": "или нажмите, чтобы выбрать его. До 1 ГБ.", + "fileInputLabel": "ZIP-файл экспорта Health Connect", + "privacyNote": "Файл удаляется с сервера сразу после завершения импорта. Записи из приложений, которые вы уже подключаете напрямую, например Withings или Fitbit, пропускаются, чтобы ничего не пришло дважды. Повторная загрузка того же файла ничего не меняет.", + "rateLimited": "Слишком много загрузок за короткое время. Подождите минуту и попробуйте снова.", + "busy": "Для вашего аккаунта уже выполняется импорт. Дождитесь его завершения.", + "rowsSoFar": "Сохранено значений: {count}", + "doneNothing": "Импорт завершён, но нового для добавления не было.", + "workouts": "Тренировки", + "leftOutConnected": "Пропущено записей из приложений, которые вы уже подключаете напрямую: {count}.", + "nutrientsModuleOff": "Итоги по воде и нутриентам не импортированы, потому что модуль «Нутриенты» выключен.", + "cycleModuleOff": "Данные о менструации не импортированы, потому что отслеживание цикла выключено.", + "failure": { + "unsupportedVersion": "Этот экспорт Health Connect слишком старый для чтения. Обновите Health Connect на телефоне и экспортируйте снова.", + "notHealthConnect": "Этот файл не является экспортом Health Connect. Выберите ZIP-файл, сохранённый Health Connect.", + "unsafeSchema": "Этот файл не имеет структуры экспорта Health Connect и не был прочитан.", + "tooLarge": "Экспорт больше, чем принимает этот сервер.", + "stagingMissing": "Загруженного файла больше нет на сервере. Загрузите его снова.", + "interrupted": "Импорт был прерван перезапуском сервера. Загрузите файл снова." + } + } + }, + "subtitle": "Экспортируйте свои данные или импортируйте измерения и записи из других приложений и файлов." + }, + "about": { + "title": "О приложении", + "subtitle": "Версия, лицензия и ссылки на проект." + }, + "sharing": { + "title": "Общий доступ", + "subtitle": "Поделитесь доступом к своим данным только для чтения." + }, + "insights": { + "subtitle": "Настройте разделы сводки и порядок чипов." + }, + "medications": { + "subtitle": "Управляйте видом и порядком списка лекарств." + }, + "mood": { + "subtitle": "Упорядочьте теги настроения, группы и порядок в выборе." + }, + "labs": { + "subtitle": "Управляйте видом, сортировкой и показателями." + }, + "illness": { + "subtitle": "Управляйте видом и порядком эпизодов." + }, + "vorsorge": { + "subtitle": "Управляйте видом, порядком и отдельными напоминаниями." + }, + "modules": { + "title": "Модули", + "saved": "Сохранено", + "error": "Не удалось сохранить. Попробуйте снова.", + "toggleable": { + "title": "Что вы отслеживаете", + "description": "Выключенные модули исчезают из навигации, плиток и аналитики, а ваши данные остаются нетронутыми." + }, + "manageIn": "Управлять в разделе {section}", + "operatorDisabled": "Выключено на всём сервере", + "subtitle": "Выберите, какие области отслеживания HealthLog показывает во всём приложении.", + "backToHub": "Назад к модулям", + "openModuleSettings": "Настройки модуля", + "pages": { + "medications": { + "title": "Лекарства", + "description": "Места инъекций, которые исключает ротация." + }, + "mood": { + "title": "Теги настроения", + "description": "Группы, ваши собственные теги и архивные теги." + }, + "labs": { + "title": "Анализы", + "description": "Показатели и распознавание текста бланков анализов на устройстве." + }, + "arrangementTitle": "Порядок и вид", + "arrangementDescription": "То, как этот список сортируется и отображается, настраивается в разделе «Расположение».", + "openArrangement": "Открыть в «Расположении»", + "moduleSettingsTitle": "Настройки модуля", + "moduleSettingsDescription": "Всё, кроме порядка и вида, настраивается на странице модуля в разделе «Модули»." + } + }, + "gesundheitsakte": { + "title": "Медицинская карта", + "subtitle": "Экспортируйте полную медицинскую карту, готовую для врача." + }, + "coach": { + "title": "Тренер", + "subtitle": "Настройте Коуча, его проактивные подсказки и память." + }, + "security": { + "title": "Безопасность", + "subtitle": "Двухфакторная аутентификация, коды восстановления и ключи доступа." + }, + "privacy": { + "title": "Данные и конфиденциальность", + "subtitle": "Ваши данные, хранение, шифрование и безопасность аккаунта в одном месте." + }, + "mcp": { + "title": "Коннектор MCP", + "subtitle": "Подключите внешнего ассистента к своим данным о здоровье." + }, + "anamnesis": { + "title": "Медицинский анамнез", + "subtitle": "Ваш медицинский фон, образ жизни, экстренные данные и то, что может читать ИИ." + }, + "environment": { + "title": "Местоположение и погода", + "subtitle": "Погода, дневной свет и контекст местоположения.", + "disabledHint": "Включите модуль «Окружение», чтобы задать домашнее местоположение и получать ежедневную погоду и данные о дневном свете.", + "searchPlaceholder": "Поиск города", + "search": "Поиск", + "searchError": "Не удалось найти это место.", + "use": "Использовать", + "select": "Выбрать", + "saveError": "Не удалось сохранить изменение.", + "homeSaved": "Домашнее местоположение сохранено", + "travelAdded": "Период местоположения добавлен.", + "travelRemoved": "Период местоположения удалён.", + "backfillQueued": "Заполнение поставлено в очередь.", + "backfillError": "Не удалось запустить заполнение.", + "startDate": "Дата начала", + "endDate": "Дата окончания", + "storedDays": "Сохранено дней с погодой: {count}.", + "home": { + "title": "Домашнее местоположение", + "description": "Приблизительное местоположение на уровне города, никогда не точный трек. Погода и дневной свет загружаются для этого места в дни, на которые не распространяется период местоположения, начиная с даты, которую вы задали.", + "current": "Текущее: {label}", + "none": "Домашнее местоположение ещё не задано.", + "since": "Погода отслеживается с {date}. Более ранние дни остаются пустыми, пока вы не добавите период местоположения." + }, + "travel": { + "title": "Периоды местоположения", + "description": "Добавьте место и диапазон дат, например поездку или отрезок прошлой истории. Период заменяет домашнее местоположение на дни, которые он охватывает, чтобы погода соответствовала тому, где вы действительно были. Так вы исправляете прошлое.", + "none": "Периодов местоположения ещё нет.", + "add": "Добавить {label}", + "remove": "Удалить период местоположения", + "removeConfirmTitle": "Удалить эту поездку?", + "removeConfirmBody": "Измерения, сделанные во время неё, остаются в вашей истории; удаляется только запись о поездке.", + "range": "с {start} по {end}", + "suggestionsIntro": "Dawarich нашёл дни за границей, которые пока не покрыты ни одним периодом.", + "suggestionUse": "Использовать", + "suggestionDismiss": "Отклонить предложение" + }, + "backfill": { + "title": "Заполнить прошлые дни", + "description": "Загрузите и сохраните погоду за прошлый диапазон дат, чтобы более ранние дни вошли в корреляции. Начало по умолчанию — дата вступления в силу домашнего местоположения; чтобы охватить более ранний период, сначала добавьте период местоположения для этого диапазона.", + "run": "Заполнить" + }, + "noResults": "Подходящих мест не найдено.", + "fetchFailedOne": "Последнее фоновое обновление погоды не удалось ({when}).", + "fetchFailedFew": "Последние {count} фоновых обновления погоды не удались, последнее — {when}.", + "fetchFailedOther": "Последние {count} фоновых обновлений погоды не удались, последнее — {when}.", + "airQuality": { + "title": "Качество воздуха и пыльца", + "description": "Ежедневное качество воздуха, пыльца и УФ-индекс для вашего местоположения по модели CAMS через Open-Meteo.", + "toggle": "Учитывать качество воздуха и пыльцу", + "operatorDisabled": "Качество воздуха выключено на этом сервере.", + "coverage": "Дней с данными о качестве воздуха: {count}", + "pollenEuropeOnly": "Данные о пыльце охватывают только Европу.", + "historyProgress": "Заполнение качества воздуха: {done} из {total} дней", + "historyComplete": "Качество воздуха заполнено для каждого более раннего дня, который охватывает источник ({total} дней). Более ранние дни остаются пустыми.", + "attribution": "Источники данных и лицензии", + "saveError": "Не удалось сохранить настройку.", + "latest": "Самый новый день ({date})", + "modelNote": "Смоделированные значения для открытого воздуха в вашем районе, а не ваша личная экспозиция." + } + }, + "score": { + "title": "Балл здоровья", + "subtitle": "Выберите, какие столпы учитываются в вашем балле.", + "card": { + "title": "Что учитывается в вашем балле", + "description": "Каждый столп, который вы записываете, учитывается, если вы не укажете иное здесь." + }, + "threeAxes": "Запись, отображение и учёт — три разные вещи. Эта страница меняет только последнее. Столп, выключенный здесь, продолжает записываться и продолжает появляться везде в HealthLog, он просто перестаёт влиять на число.", + "recommendation": "Три области здоровья — рекомендация, а не требование: выбор сохраняется с хотя бы одним столпом. Более узкий балл рассчитывается так же и указывает на карточке, на скольких областях он основан.", + "axis": { + "countsFor": "Учитывать {pillar} в балле" + }, + "state": { + "counting": "Учитывается в вашем балле", + "waiting": "Выбрано, ожидание данных", + "crisis": "Вместо балла показаны рекомендации по безопасности. Ваш выбор в порядке.", + "readFailed": "Этот столп не удалось прочитать при последнем запуске." + }, + "presets": { + "label": "Начать с", + "all": "Все столпы", + "current": "Ваш сохранённый выбор" + }, + "save": "Сохранить", + "saved": "Сохранено", + "error": "Не удалось сохранить. Попробуйте снова.", + "loadFailed": "Не удалось загрузить ваш выбор.", + "eligibilityFailed": "Не удалось проверить, у каких столпов сейчас есть данные. Переключатели ниже всё равно работают.", + "omitted": "{count} столпов не показаны, потому что их отслеживание выключено. Включите модуль снова, и его столп вернётся.", + "omittedLink": "Открыть модули", + "refusal": { + "empty": "Баллу здоровья нужна хотя бы одна область здоровья для оценки. Оставьте одну выбранной; балл укажет, из каких областей он построен." + }, + "notice": { + "upgrade": { + "title": "Теперь что учитывается — ваш выбор", + "body": "Раньше то, какие столпы учитывались в вашем балле здоровья, зависело от включённых модулей. Теперь это отдельный выбор, и эта страница — где вы его делаете. Ваше число не изменилось, когда это появилось: оно по-прежнему учитывает ровно то же, что и раньше." + }, + "changed": { + "title": "Вы изменили то, что учитывается", + "body": "С {date} ваш балл рассчитывается из другого набора столпов. Дни до этого рассчитывались из старого набора, поэтому они не сравниваются, и недельное изменение остаётся на паузе, пока окно сравнения не очистится от изменения. Собственная история каждого столпа проходит сквозь него без разрыва.", + "bodyUndated": "Ваш балл рассчитывается из другого набора столпов, чем раньше. Дни до изменения рассчитывались из старого набора, поэтому они не сравниваются, и недельное изменение остаётся на паузе, пока окно сравнения не очистится от изменения. Собственная история каждого столпа проходит сквозь него без разрыва." + }, + "composition": { + "title": "Что учитывается, изменилось само", + "left": "Больше не учитывается в вашем балле: {pillars}. Число изменилось по этой причине, а не из-за вашего здоровья.", + "joined": "Теперь учитывается в вашем балле: {pillars}." + }, + "dismiss": "Понятно", + "dismissError": "Не удалось сохранить. Попробуйте снова." + } + }, + "access": { + "title": "Общий доступ", + "subtitle": "Кто может открыть вашу медицинскую карту и чью можете открыть вы." + } + }, + "profile": "Профиль", + "language": "Язык", + "languageDescription": "Выберите язык интерфейса приложения.", + "timeFormat": { + "title": "Формат часов", + "description": "Определяет, отображается ли время в 24-часовом или 12-часовом (AM/PM) формате.", + "auto": "Автоматически (по языку)", + "h24": "24-часовой", + "h12": "12-часовой (AM/PM)", + "saved": "Формат часов сохранён", + "saveError": "Не удалось сохранить формат часов." + }, + "dateFormat": { + "title": "Формат даты", + "description": "Определяет порядок дня, месяца и года при отображении дат.", + "auto": "Автоматически (по языку)", + "dmy": "ДД.ММ.ГГГГ", + "mdy": "ММ/ДД/ГГГГ", + "ymd": "ГГГГ-ММ-ДД", + "saved": "Формат даты сохранён", + "saveError": "Не удалось сохранить формат даты." + }, + "username": "Имя пользователя", + "height": "Рост (см)", + "heightFtIn": "Рост (фут, дюйм)", + "dateOfBirth": "Дата рождения", + "dateOfBirthHint": "Используется для автоматического расчёта целевых значений АД.", + "gender": "Пол", + "genderNone": "Не указан", + "genderMale": "Мужской", + "genderFemale": "Женский", + "genderHint": "Используется для целевых значений, зависящих от пола.", + "timezone": "Часовой пояс", + "timezoneHint": "Используется для подписей осей графиков, времени напоминаний, отметок времени экспорта и контекста Коуча. Сохранённые данные не меняются.", + "timezoneInvalid": "Недопустимый часовой пояс IANA.", + "profileSaved": "Профиль сохранён", + "profilePartiallySaved": "Профиль сохранён, но {field} не удалось обновить.", + "profileNothingSaved": "Ничего не сохранено. Исправьте {field} и попробуйте снова.", + "profileRejection": { + "tooBig": "Это значение выше диапазона, который принимает это поле.", + "tooSmall": "Это значение ниже диапазона, который принимает это поле.", + "invalidValue": "Это не один из ответов, которые принимает это поле.", + "invalidFormat": "Это записано не в той форме, которую может прочитать это поле.", + "invalidType": "Это значение пришло не в той форме, которую может сохранить это поле.", + "rateLimited": "Слишком частые изменения. Подождите немного и попробуйте снова.", + "other": "Это значение не принято. Проверьте его и попробуйте снова.", + "reproofRequired": "Введите текущий пароль, чтобы изменить адрес электронной почты.", + "reproofFailed": "Пароль неверный, поэтому адрес электронной почты не изменён.", + "secondFactorRequired": "Подтвердите вторым фактором или ключом доступа, чтобы изменить адрес электронной почты." + }, + "avatar": { + "title": "Фото профиля", + "description": "Загрузите фото, хранящееся на вашем собственном сервере. Оно отображается во всём приложении вместо внешнего сервиса аватаров.", + "upload": "Загрузить фото", + "replace": "Заменить фото", + "remove": "Убрать", + "removeTitle": "Убрать фото профиля?", + "removeBody": "Изображение удаляется с вашего сервера, и его место занимают ваши инициалы. Чтобы загрузить его снова, понадобится исходный файл.", + "removeConfirm": "Убрать фото", + "hint": "JPEG, PNG или WebP. До 2 МБ и 2048×2048 пикселей.", + "uploaded": "Фото профиля обновлено", + "removed": "Фото профиля убрано", + "invalidType": "Неподдерживаемый тип изображения. Используйте JPEG, PNG или WebP.", + "tooLarge": "Изображение превышает лимит 2 МБ.", + "error": "Не удалось обновить фото профиля. Попробуйте снова." + }, + "changePassword": "Изменить пароль", + "changePasswordDescription": "Замените текущий пароль новым.", + "currentPassword": "Текущий пароль", + "newPassword": "Новый пароль", + "confirmNewPassword": "Подтвердите новый пароль", + "passwordMismatch": "Новые пароли не совпадают", + "passwordUpdated": "Пароль успешно обновлён", + "passkeys": "Ключи доступа", + "passkeysDescription": "Ключи доступа позволяют безопасно входить без пароля.", + "passkeyReauth": { + "title": "Подтвердите, что это вы", + "description": "Подтвердите существующий способ входа перед добавлением нового ключа доступа.", + "methodLabel": "Способ подтверждения", + "methods": { + "password": "Пароль", + "totp": "Код аутентификатора", + "passkey": "Ключ доступа", + "webauthn": "Ключ безопасности", + "oidc": "Провайдер идентификации" + }, + "currentPassword": "Текущий пароль", + "authenticatorCode": "Код аутентификатора", + "authenticatorPlaceholder": "6-значный код аутентификатора", + "verifyAndAdd": "Подтвердить и добавить", + "factorDescription": "Подтвердите существующий способ входа перед добавлением второго фактора.", + "verifyAndContinue": "Подтвердить и продолжить", + "oidcHint": "Вы ещё раз войдёте у своего провайдера идентификации и сразу вернётесь на эту страницу. Затем повторите то, что собирались сделать.", + "continueToProvider": "Перейти ко входу" + }, + "passkeyName": "Название", + "noPasskeys": "Ключи доступа не зарегистрированы.", + "addPasskey": "Добавить ключ доступа", + "passkeyRegistrationFailed": "Не удалось зарегистрировать ключ доступа", + "passkeyRegistrationCancelled": "Регистрация ключа доступа отменена", + "passkeyNotSupported": "Ваш браузер или устройство пока не поддерживает ключи доступа. Попробуйте другой браузер или устройство.", + "passkeyAlreadyRegistered": "Это устройство уже зарегистрировано как ключ доступа для вашего аккаунта.", + "passkeySecurityBlocked": "Браузер заблокировал запрос ключа доступа по соображениям безопасности. Убедитесь, что вы на доверенном источнике HTTPS, и попробуйте снова.", + "passkeyTimeout": "Время ожидания запроса ключа доступа истекло. Попробуйте снова.", + "passkeyUnknownError": "Не удалось зарегистрировать ключ доступа: {message}", + "deletePasskey": "Удалить ключ доступа?", + "deletePasskeyDescription": "Ключ доступа будет удалён безвозвратно.", + "singleDevice": "Одно устройство", + "multiDevice": "Несколько устройств", + "backedUp": "с резервной копией", + "telegram": "Telegram", + "telegramDescription": "Напоминания о лекарствах через бота.", + "botToken": "Токен бота", + "chatId": "ID чата", + "enableNotifications": "Включить уведомления", + "telegramStep1": "Создайте бота через @BotFather в Telegram и скопируйте токен.", + "telegramStep2": "Отправьте /start своему боту, чтобы активировать чат.", + "telegramStep3": "Узнайте свой Chat ID через @userinfobot или Bot API.", + "ntfy": "ntfy", + "ntfyDescription": "Уведомления через ntfy (self-hosted или ntfy.sh).", + "ntfyEnable": "Включить ntfy", + "ntfyServer": "URL сервера", + "ntfyTopic": "Тема", + "ntfyAuthToken": "Токен авторизации (необязательно)", + "ntfyAuthTokenHint": "Нужен только для приватных тем с контролем доступа.", + "webhook": "Вебхук", + "webhookDescription": "Отправляйте уведомления POST на любой URL: Discord, Slack, Gotify, Home Assistant, n8n или любой ретранслятор, принимающий JSON.", + "webhookEnable": "Включить вебхук", + "webhookUrl": "URL вебхука", + "webhookUrlHint": "Полный URL для POST. Адрес в частной сети требует одобрения оператора сервера.", + "webhookHeaderName": "Имя заголовка (необязательно)", + "webhookHeaderValue": "Значение заголовка (необязательно)", + "webhookFormat": "Формат полезной нагрузки", + "webhookFormatGeneric": "Универсальный JSON", + "webhookFormatGenericHint": "Вставьте URL вебхука Discord или Slack как есть. Home Assistant и n8n читают поля title, message, eventType и priority.", + "webhookFormatGotify": "Gotify", + "webhookFormatGotifyHint": "Используйте URL, оканчивающийся на /message, и поместите токен приложения в заголовок X-Gotify-Key.", + "email": "Электронная почта", + "emailDescription": "Получайте оповещения и напоминания по электронной почте.", + "emailEnable": "Включить электронную почту", + "emailRecipient": "Адрес получателя", + "webPush": "Push в браузере", + "webPushDescription": "Получайте уведомления прямо в браузере, даже когда HealthLog не открыт.", + "webPushNotSupported": "Ваш браузер не поддерживает push-уведомления.", + "webPushDenied": "Push-уведомления заблокированы. Разрешите их в настройках браузера.", + "webPushNotConfigured": "Web Push не настроен на сервере.", + "webPushSubscribe": "Включить push", + "webPushUnsubscribe": "Выключить push", + "webPushSubscribed": "Push-уведомления включены!", + "webPushUnsubscribed": "Push-уведомления выключены.", + "webPushSubscribeFailed": "Не удалось активировать", + "codexConnected": "ChatGPT успешно подключён! Аналитика теперь активна.", + "codexDisconnected": "Подключение ChatGPT удалено.", + "codexConnectionFailed": "Не удалось подключить ChatGPT. Попробуйте снова.", + "rawData": "Отправлять подробную историю", + "rawDataOnDescription": "Помимо сводок, провайдер получает средние значения ваших измерений: за день за последние 90 дней, за неделю за предыдущий год и за месяц до 5 лет назад, каждое с датой и числом измерений. Отдельные измерения, ваше имя и адрес электронной почты не отправляются.", + "rawDataOffDescription": "Отправляются только сводки: последнее значение, средние, динамика, минимум и максимум за фиксированные окна. Никаких рядов измерений.", + "rawDataWarning": "Подробная история включена: каждый анализ также отправляет дневные средние за последние 90 дней, недельные средние за предыдущий год и месячные средние до 5 лет назад.", + "regenerateInsights": "Пересоздать отчёты", + "regenerateSuccess": "Отчёты успешно пересозданы", + "regenerateRateLimit": "Подождите: вы достигли почасового лимита анализов.", + "lastGeneratedAt": "Последнее создание", + "ai": { + "chatgptConnectedBadge": "ChatGPT подключён", + "adminAiActiveBadge": "Провайдер администратора активен", + "connectionExpiredBadge": "Подключение истекло", + "connectedSince": "Подключено с {when}.", + "deviceCodeHeading": "Завершите подключение на chatgpt.com", + "deviceCodeStep1": "Откройте эту ссылку на любом устройстве:", + "deviceCodeStep2": "Введите этот одноразовый код:", + "deviceCodeStep3": "Одобрите подключение. Эта страница обновится автоматически.", + "deviceCodeCopy": "копировать", + "deviceCodeWaiting": "Ожидание одобрения…", + "deviceCodeCancel": "Отмена", + "oauthNotConfigured": "ChatGPT OAuth не настроен на этом экземпляре. Используйте вместо этого свой API-ключ ниже.", + "modelLabel": "Модель", + "modelOptionDefault": "— По умолчанию —", + "modelOptionCustom": "Своя…", + "customModelLabel": "Своё название модели", + "anthropicKeyLabel": "API-ключ Anthropic", + "baseUrlLabel": "Базовый URL", + "localKeyLabel": "API-ключ (необязательно)", + "localDescription": "Здесь работает любая конечная точка, совместимая с OpenAI: локальная модель (Ollama, LM Studio), а также шлюз, например LiteLLM, OpenRouter или vLLM. Базовый URL оканчивается на /v1; API-ключ необязателен.", + "savedPreview": "(сохранено {preview})", + "savedShort": "(сохранено)", + "saveCta": "Сохранить", + "saved": "Сохранено", + "errorGeneric": "Ошибка", + "providerChain": { + "types": { + "codex": "ChatGPT (Codex)", + "openai": "OpenAI (ваш ключ)", + "anthropic": "Anthropic (Claude)", + "local": "Локальная модель", + "openai-compatible": "Шлюз, совместимый с OpenAI", + "admin-openai": "OpenAI администратора" + }, + "title": "Цепочка резервных провайдеров", + "description": "Если активный провайдер не отвечает, HealthLog пробует следующий включённый в этом порядке.", + "moveUp": "Вверх", + "moveDown": "Вниз", + "removeFromChain": "Убрать из цепочки", + "addProvider": "Добавить провайдера", + "addNoneAvailable": "Все провайдеры уже в цепочке", + "saveOrder": "Сохранить порядок цепочки", + "saved": "Цепочка сохранена", + "saveFailed": "Не удалось сохранить цепочку", + "resetDefaults": "Сбросить к значениям по умолчанию", + "resetConfirmTitle": "Сбросить цепочку к значениям по умолчанию?", + "resetConfirmBody": "Цепочка вернётся к Codex → OpenAI → Anthropic → Локальная → OpenAI администратора. Ваши сохранённые учётные данные не затрагиваются." + }, + "activeProviderHeading": "Активный провайдер", + "activeProviderLabel": "Настроить провайдера", + "providerSelect": { + "codex": "Аккаунт ChatGPT (Codex)", + "openai": "OpenAI (ваш API-ключ)", + "anthropic": "Anthropic (Claude)", + "local": "Локальная модель (совместимая с OpenAI)", + "openai-compatible": "Шлюз, совместимый с OpenAI", + "admin-openai": "OpenAI от администратора" + }, + "compat": { + "description": "Полноценный провайдер для любой конечной точки, поддерживающей API OpenAI /v1/chat/completions: LiteLLM, OpenRouter, vLLM или другой шлюз. Базовый URL оканчивается на /v1, API-ключ необязателен, а модель — та, которую маршрутизирует ваш шлюз. Ваш ключ OpenAI никогда не попадает на эту конечную точку; у этого провайдера свой.", + "keyLabel": "API-ключ (необязательно)", + "modelHint": "Название модели, которое ожидает ваш шлюз. Если оставить пустым, используется модель, сохранённая для других ваших провайдеров; если не задано ни то ни другое, этот провайдер пропускается." + }, + "openai": { + "modelSelect": "Модель", + "modelOptionCustom": "Свой идентификатор…", + "modelCustomLabel": "Свой идентификатор модели", + "modelCustomPlaceholder": "gpt-5", + "baseUrlLabel": "Базовый URL (расширенно)", + "baseUrlPlaceholder": "https://api.openai.com/v1", + "baseUrlHelp": "Переопределяйте только при использовании шлюза, совместимого с OpenAI. Оставьте пустым для самого OpenAI.", + "showAdvanced": "Показать расширенные", + "hideAdvanced": "Скрыть расширенные", + "apiKey": "API-ключ", + "apiKeyPlaceholder": "sk-…" + }, + "codex": { + "statusConnected": "Подключено", + "statusDisconnected": "Не подключено", + "statusExpired": "Подключение истекло", + "connectButton": "Подключить через ChatGPT", + "disconnectButton": "Отключить", + "disconnectTitle": "Отключить ChatGPT?", + "disconnectBody": "Сохранённый вход будет удалён вместе с кэшированным текстом аналитики. Для повторного подключения потребуется снова войти через поток с кодом устройства.", + "disconnectConfirm": "Отключить", + "modelSlugLabel": "Идентификатор модели", + "modelSlugBody": "Codex использует модель, на которую маршрутизирует ваша подписка ChatGPT. Переменная окружения CODEX_MODEL позволяет операторам переопределить это на экземпляре.", + "lastInsight": "Последняя аналитика: {when}" + }, + "adminOpenai": { + "title": "OpenAI администратора", + "body": "Ключ OpenAI, предоставленный оператором, используется как последний резерв, когда личный провайдер не настроен. Здесь настраивать нечего.", + "notConfigured": "Оператор не настроил общий ключ OpenAI на этом экземпляре." + }, + "testProvider": "Проверить активного провайдера", + "testSuccess": "OK: {provider} ({model})", + "testFailedShort": "Проверка не удалась: {message}", + "testUnexpectedResponse": "Не удалось подключиться к провайдеру ИИ: неожиданный ответ от сервера.", + "testReasonCredentials": "Провайдер отклонил учётные данные. Повторно авторизуйтесь в настройках ИИ.", + "testReasonRateLimited": "Провайдер ограничил частоту запросов. Попробуйте вскоре снова.", + "testReasonServerError": "Провайдер ИИ вернул ошибку сервера.", + "testReasonBadRequest": "Провайдер отклонил запрос (HTTP {status}). Конечная точка ответила, значит проблема в форме запроса или названии модели, а не в подключении.", + "testReasonUnreachable": "Не удалось связаться с провайдером ИИ.", + "coachMemory": { + "title": "Что помнит Коуч", + "description": "Устойчивые факты, которые вы сообщили Коучу.", + "empty": "Коуч пока не сохранил ни одного факта. По мере общения он запоминает устойчивые детали, которыми вы делитесь (ваши цели, состояния, предпочтения), и вы можете очистить их здесь в любой момент.", + "learnedPrefix": "изучено {when}", + "categoryPreference": "Предпочтения", + "categoryCondition": "Состояния", + "categoryGoal": "Цели", + "categoryConstraint": "Ограничения", + "categoryContext": "Контекст", + "forgetAria": "Забыть этот факт", + "forgetTitle": "Забыть этот факт?", + "forgetBody": "Коуч перестанет его использовать со следующего сообщения. Вернуть забытый факт невозможно.", + "forgetConfirm": "Забыть", + "forgetAll": "Забыть всё", + "forgetAllConfirmTitle": "Забыть всё, что помнит Коуч?", + "forgetAllConfirmBody": "Это удалит каждый сохранённый факт. Коуч начнёт с чистого листа при следующем общении. Это нельзя отменить.", + "forgetAllConfirmAction": "Забыть всё", + "cancel": "Отмена", + "summaryNote": "Коуч также может хранить краткую скользящую сводку каждого разговора. Для неё нет отдельного управления; удаление разговора удаляет его сводку.", + "loadError": "Не удалось загрузить то, что помнит Коуч.", + "forgotToast": "Факт забыт.", + "forgotError": "Не удалось забыть этот факт. Попробуйте снова.", + "clearedToast": "Забыто сохранённых фактов: {count}.", + "clearError": "Не удалось очистить сохранённые факты. Попробуйте снова.", + "detail": "Он использует их, чтобы ответы оставались уместными. Уберите всё, что предпочли бы забыть.", + "categoryMedication": "Лекарства" + }, + "coachReminders": { + "title": "Ваши напоминания", + "description": "То, что вы попросили Коуча напомнить позже.", + "empty": "Напоминаний пока нет. Попросите Коуча напомнить вам о чём-нибудь, и это появится здесь.", + "loadError": "Не удалось загрузить ваши напоминания.", + "dueHeading": "Срок сейчас", + "allHeading": "Сохранённые", + "duePrefix": "срок {when}", + "confirm": "Оставить", + "markDone": "Готово", + "dismiss": "Закрыть", + "deleteAria": "Удалить это напоминание", + "note": "Напоминания хранятся в зашифрованном виде. Удалите любое в любой момент, и оно исчезнет из того, что видит Коуч.", + "status": { + "proposed": "Предложено", + "active": "Сохранено", + "due": "Срок", + "surfaced": "Показано", + "done": "Готово", + "dismissed": "Закрыто" + }, + "deleteConfirmTitle": "Удалить это напоминание?", + "deleteConfirmBody": "Оно перестанет подниматься. Всё, что вы уже записали, не затрагивается.", + "deleteConfirmAction": "Удалить", + "detail": "Напоминания со сроком появляются здесь и у Коуча.", + "readOnlyNote": "Коуч сейчас недоступен, но вы всё равно можете читать и удалять свои напоминания." + }, + "aboutMe": { + "title": "Обо мне", + "description": "Личный контекст, который Коуч и ежедневная сводка читают вместе с вашими данными.", + "placeholder": "Например: сменная работа, вегетарианская диета, травма колена, подготовка к полумарафону…", + "charCount": "{used} / {max} символов", + "clear": "Очистить", + "clearTitle": "Очистить заметку «Обо мне»?", + "clearBody": "Это удаляет только заметку свободного текста. Ваши аллергии и непереносимости остаются точно как есть.", + "clearConfirm": "Очистить заметку", + "save": "Сохранить", + "savedToast": "Заметка «Обо мне» сохранена", + "clearedToast": "Заметка «Обо мне» очищена.", + "saveError": "Не удалось сохранить. Попробуйте снова.", + "loadError": "Не удалось загрузить заметку.", + "hint": "Передаётся Коучу и ежедневной сводке как дополнительный контекст. Оставьте пустым, чтобы ничего не отправлять.", + "profileHint": "Возраст и пол берутся из вашего профиля и включаются автоматически.", + "freeTextLabel": "Обо мне (свободный текст)", + "conditionsPlaceholder": "Например: гипертония, диабет 2 типа…", + "allergiesPlaceholder": "Например: непереносимость лактозы, аллергия на пенициллин…", + "focusPlaceholder": "Например: следить за моим АД, мотивировать больше двигаться…", + "questionsTitle": "У Коуча есть уточняющие вопросы", + "questionsOpenCoach": "Ответьте на них в Коуче" + }, + "responseTimeoutHeading": "Тайм-аут ответа", + "responseTimeoutBody": "Сколько ждать ответа ИИ, прежде чем сдаться. Увеличьте для локальной или self-hosted модели, которой нужно время на загрузку при первом запросе. Если оставить пустым, ответ может занять {seconds} с; ежедневная сводка допускает до {briefingSeconds} с.", + "responseTimeoutLabel": "Тайм-аут ответа (секунды)", + "responseTimeoutPlaceholder": "По умолчанию ({seconds} с)", + "responseTimeoutInvalid": "Введите число от 10 до 600 секунд.", + "autoRead": { + "title": "Автоматически читать документы с помощью ИИ", + "subLabel": "Ваш провайдер ИИ читает и индексирует каждый новый документ без нажатия на каждый документ.", + "honesty": "Когда включено, каждый загруженный документ отправляется вашему настроенному провайдеру ИИ для чтения, описания и индексации для поиска, без подтверждения по каждому документу. Включение также действует назад: документы, которые вы уже загрузили и у которых ещё нет сводки, тоже отправляются, до 200 каждый раз, когда вы включаете это. Это происходит на сервере, и содержимое документа покидает эту машину и уходит этому провайдеру. Если ваш настроенный провайдер — это подключение по подписке (вошедший в систему аккаунт ИИ, а не API-ключ), действуют собственные настройки данных этого провайдера: провайдеры по подписке могут использовать содержимое для улучшения своих моделей, и никакое соглашение об обработке данных это не покрывает. Документы, прочитанные локальной self-hosted моделью, никогда не покидают ваш сервер. По умолчанию выключено; включайте, только если принимаете этот обмен для своих документов.", + "confirm": "Понимаю, включить", + "cancel": "Отмена", + "restingFrugal": "Приостановлено на экономном уровне использования ИИ: документы читаются только по вашему запросу." + }, + "centralCodex": { + "title": "Использовать общий доступ к ИИ сервера", + "subLabel": "Отправляйте запросы ИИ через общее подключение сервера, а ваши собственные провайдеры — как резерв.", + "honesty": "Общий доступ — это единый вошедший в систему аккаунт ИИ, который оператор подключил для всех на этом сервере, а не ваш собственный ключ. Запросы, которые вы делаете через него, по умолчанию используются провайдером для обучения, и никакое соглашение об обработке данных их не покрывает, почасовые и недельные лимиты аккаунта делятся со всеми другими пользователями, которые согласились, а ваши собственные настроенные провайдеры всё равно пробуются первыми. Включайте, только если принимаете этот обмен.", + "confirm": "Понимаю, использовать подключение", + "cancel": "Отмена" + }, + "consent": { + "title": "Согласие на ИИ", + "activeSince": "Дано {date}: ваши данные о здоровье могут отправляться настроенному провайдеру для функций ИИ.", + "withdraw": "Отозвать согласие", + "confirmBody": "Если другое данное вами согласие всё ещё их не покрывает, сразу прекращается следующее: Коуч и Аналитика там, где они используют доступ к ИИ, который предоставляет этот сервер, и чтение документов онлайн-моделью. На вашем собственном ключе или локальной модели Коуч и Аналитика продолжают работать. Если другое согласие всё ещё не покрывает Аналитику, заметки, написанные для вас моделью, удаляются: статусные заметки, ежедневная сводка, написанные моделью сводки за период, строки прибытия и заметки о тренировках. Ваши разговоры с Коучем, то, что запомнил Коуч, ваши планы и сводки документов остаются, и вы можете читать или удалять их сами.", + "confirmWithdraw": "Отозвать", + "grantError": "Не удалось сохранить согласие. Попробуйте снова.", + "error": "Не удалось сохранить отзыв. Попробуйте снова.", + "documentReading": { + "title": "Согласие на чтение документов", + "activeSince": "Дано {date}: документы, сканы анализов и текст о лекарствах могут отправляться в ваш сервис ИИ для чтения.", + "confirmBody": "Документы, сканы бланков анализов и описания лекарств больше не отправляются на чтение. Ничего из того, что у вас уже есть, не удаляется." + }, + "activeSinceNamed": "Дано {date}: ваши данные о здоровье могут отправляться в {providers} для функций ИИ.", + "activeUndated": "Дано: ваши данные о здоровье могут отправляться настроенному провайдеру для функций ИИ.", + "request": { + "title": "Ваше согласие до запуска ИИ", + "body": "ИИ на этом сервере работает на сервисе, который предоставляет оператор: {providers}. Ничего из ваших записей не уходит туда, пока вы не согласитесь.", + "data": "После согласия HealthLog отправляет этому сервису то, что нужно функциям ИИ: измерения, такие как вес, АД, пульс, сон и активность, ваши лекарства, настроение, результаты анализов и записи цикла, если вы их ведёте, то, что вы пишете в профиле и Коучу, и документы, которые вы решили дать прочитать. Сервис использует это, чтобы писать вашу ежедневную сводку, заметки к вашим измерениям и ответы Коуча.", + "withdrawHint": "Вы можете отозвать согласие в любой момент в разделе «Настройки», «ИИ». С этого момента больше ничего не отправляется.", + "agree": "Согласиться", + "dismiss": "Не сейчас" + } + }, + "operatorOff": { + "allTitle": "ИИ выключен на этом сервере", + "allBody": "Человек, который управляет этим сервером, выключил ИИ. HealthLog продолжает работать со всеми вашими данными; функции, которым нужен ИИ, просто не показываются.", + "someTitle": "Некоторые функции ИИ выключены на этом сервере", + "someBody": "Человек, который управляет этим сервером, выключил: {switches}. Всё остальное, включая все ваши данные, работает как обычно.", + "testRefused": "ИИ выключен на этом сервере, поэтому проверять нечего.", + "autoRead": "Чтение документов с помощью ИИ выключено на этом сервере." + }, + "coachConversations": { + "title": "Разговоры с Коучем", + "description": "Откройте разговор, чтобы прочитать его, или удалите его.", + "more": "Показать больше", + "openAll": "Открыть все разговоры" + }, + "coachPlans": { + "title": "Планы Коуча", + "description": "Планы, о которых вы договорились с Коучем, для чтения или удаления.", + "open": "Открыть планы" + }, + "reasoning": { + "label": "Рассуждение", + "hint": "Модели рассуждения, такие как Gemma или Qwen, думают перед ответом. Выключено оставляет весь бюджет ответа на сам ответ.", + "options": { + "default": "По умолчанию", + "none": "Выключено", + "low": "Низкое", + "medium": "Среднее", + "high": "Высокое" + }, + "coachNote": "В Коуче применяется глубина мышления из настроек Коуча.", + "backgroundNote": "Фоновая работа, такая как ежедневная сводка, не использует эту настройку: она думает максимум на среднем уровне, ниже, когда оператор задаёт более низкий предел, и вовсе не думает на экономном уровне использования." + }, + "providerCardDescription": "Настройте ключ и модель каждого провайдера; порядок ниже определяет, к кому HealthLog обращается первым.", + "runtimeTitle": "Проверить и обновить", + "usage": { + "title": "Использование ИИ", + "description": "Сколько работы ИИ выполняется в фоне для вас, при этом Коуч остаётся одинаковым на каждом уровне.", + "levels": { + "frugal": { + "label": "Экономный", + "hint": "Карточки обновляются не чаще раза в день после синхронизации, короткая ежедневная сводка, документы читаются только по вашему запросу." + }, + "standard": { + "label": "Стандартный", + "hint": "Карточки обновляются каждые несколько часов после синхронизации, полная ежедневная сводка." + }, + "full": { + "label": "Полный", + "hint": "Карточки обновляются до раза в час после новых данных, как было до появления этой настройки." + } + }, + "limited": "Ограничено оператором сервера.", + "estimate": "около {tokens} токенов в день, оценка", + "measured": "Измерено: {tokens} токенов в день за последние {days} дней, включая Коуча. Цифры по уровням — оценки.", + "noEstimate": "Оценка по уровням появится после трёх дней использования ИИ.", + "capped": "Вы выбрали {choice}, что сервер сейчас не разрешает, поэтому применяется {level}. Ваш выбор сохранён.", + "followsDefault": "Вы следуете значению сервера по умолчанию ({level}).", + "useDefault": "Использовать значение сервера по умолчанию ({level})", + "saveError": "Не удалось сохранить уровень. Попробуйте снова." + }, + "removeKey": { + "label": "Убрать API-ключ", + "title": "Убрать сохранённый API-ключ?", + "body": "HealthLog удаляет сохранённый ключ и не может его восстановить. Введите его снова, чтобы продолжить использовать.", + "confirm": "Убрать API-ключ", + "done": "API-ключ убран.", + "failed": "Не удалось убрать API-ключ." + } + }, + "dashboard": { + "units": { + "title": "Единицы", + "description": "Выберите, как расстояния и скорости отображаются на графиках и плитках.", + "metric": "Метрические", + "imperial": "Имперские", + "saved": "Предпочтение единиц сохранено", + "saveError": "Не удалось сохранить предпочтение единиц." + }, + "glucoseUnit": { + "title": "Глюкоза крови", + "description": "В каких единицах отображаются измерения глюкозы крови. Измерения хранятся одинаково в любом случае.", + "saved": "Единица глюкозы сохранена", + "saveError": "Не удалось сохранить единицу глюкозы." + } + }, + "withings": "Withings", + "withingsDescription": "Подключите свои весы и тонометр Withings, чтобы автоматически синхронизировать вес, состав тела и АД.", + "withingsCredentials": "Учётные данные API", + "withingsClientId": "ID клиента", + "withingsClientSecret": "Секрет клиента", + "withingsCredentialsSaved": "Учётные данные сохранены", + "withingsCredentialsSavedPlaceholder": "Сохранено. Введите новые для замены", + "withingsCredentialsSavedPlaceholderSecret": "Сохранено. Введите новые для замены", + "withingsSaveCredentials": "Сохранить", + "configured": "Настроено", + "withingsSync": "Синхронизировать сейчас", + "withingsFullSync": "Синхронизировать все данные", + "withingsFullSyncTitle": "Полная синхронизация?", + "withingsFullSyncDescription": "Все доступные данные Withings будут полностью синхронизированы. Это может занять некоторое время в зависимости от вашей истории.", + "withingsSyncResult": "Синхронизировано измерений: {count}", + "syncOutcome": { + "empty": "Нового для импорта нет. Всё актуально.", + "failed": "Ничего не сохранено. Следующий запуск повторит попытку.", + "partial": "Синхронизировано измерений: {count}. Часть данных не удалось сохранить; следующий запуск повторит попытку." + }, + "withingsFullSyncResult": "Полностью синхронизировано измерений: {count}", + "withingsSyncFailed": "Синхронизация не удалась", + "withingsOauthConnected": "Withings подключён. Первая синхронизация начнётся в фоне.", + "withingsOauthFailed": "Не удалось подключить Withings", + "withingsOauthError": { + "csrf1": "Проверка безопасности не прошла, потому что не было cookie браузера. Начните подключение снова в том же браузере.", + "replay": "Эта ссылка подтверждения уже использована. Начните подключение снова.", + "state": "Ответ от Withings не совпал ни с одним открытым запросом на подключение. Начните подключение снова.", + "expired": "Запрос на подключение истёк. Начните подключение снова и завершите одобрение в течение нескольких минут.", + "cross_user": "Ответ относится к запросу из другого аккаунта. Перезапустите подключение из своего аккаунта.", + "nocode": "Withings не вернул код авторизации. Попробуйте снова и разрешите доступ в диалоге Withings.", + "nocreds": "Учётные данные API Withings не сохранены. Сначала сохраните client ID и client secret, затем подключитесь снова.", + "token": "Обмен токена с Withings не удался. Проверьте client ID и client secret и попробуйте снова.", + "generic": "Неизвестная ошибка при подключении. Начните подключение снова.", + "already_linked": "Этот аккаунт Withings уже подключён к другому профилю HealthLog. Войдите в Withings с аккаунтом, который относится к этому профилю, или сначала отключите его от другого профиля." + }, + "withingsSynchronize": "Синхронизировать", + "withingsDisconnect": "Отключить", + "withingsDisconnectTitle": "Отключить Withings?", + "withingsDisconnectDescription": "Подключение к Withings будет разорвано. Ранее синхронизированные данные сохранятся.", + "withingsConnect": "Подключить Withings", + "withingsNoCredentials": "Введите свои учётные данные API выше, чтобы подключить Withings.", + "whoop": "WHOOP", + "whoopDescription": "Подключите свой браслет WHOOP, чтобы синхронизировать восстановление, сон, напряжение и тренировки прямо в HealthLog.", + "whoopCredentials": "Учётные данные API", + "whoopClientId": "ID клиента", + "whoopClientSecret": "Секрет клиента", + "whoopCredentialsSaved": "Учётные данные сохранены", + "whoopCredentialsSavedPlaceholder": "Сохранено. Введите новые для замены", + "whoopCredentialsSavedPlaceholderSecret": "Сохранено. Введите новые для замены", + "whoopSaveCredentials": "Сохранить", + "whoopSync": "Синхронизировать сейчас", + "whoopFullSync": "Синхронизировать все данные", + "whoopFullSyncTitle": "Полная синхронизация?", + "whoopFullSyncDescription": "Вся доступная история WHOOP будет полностью синхронизирована. Это может занять некоторое время в зависимости от вашей истории.", + "whoopSyncResult": "Синхронизировано измерений: {count}", + "whoopSyncFailed": "Синхронизация не удалась", + "whoopSynchronize": "Синхронизировать", + "whoopDisconnect": "Отключить", + "whoopDisconnectTitle": "Отключить WHOOP?", + "whoopDisconnectDescription": "Подключение к WHOOP будет разорвано. Ранее синхронизированные данные сохранятся.", + "whoopConnect": "Подключить WHOOP", + "whoopNoCredentials": "Введите свои учётные данные API выше, чтобы подключить WHOOP.", + "whoopOauthConnected": "WHOOP подключён. Первая синхронизация начнётся в фоне.", + "whoopOauthFailed": "Не удалось подключить WHOOP", + "whoopOauthError": { + "csrf1": "Проверка безопасности не прошла, потому что не было cookie браузера. Начните подключение снова в том же браузере.", + "state": "Ответ от WHOOP не совпал ни с одним открытым запросом на подключение. Начните подключение снова.", + "expired": "Запрос на подключение истёк до завершения. Начните подключение снова.", + "cross_user": "Ответ относится к запросу из другого аккаунта. Перезапустите подключение из своего аккаунта.", + "nocode": "WHOOP не вернул код авторизации. Попробуйте снова и разрешите доступ в диалоге WHOOP.", + "nocreds": "WHOOP не настроен. Добавьте свои учётные данные OAuth WHOOP выше и попробуйте снова.", + "token": "Обмен токена с WHOOP не удался. Начните подключение снова.", + "generic": "Неизвестная ошибка при подключении. Начните подключение снова.", + "already_linked": "Этот аккаунт WHOOP уже подключён к другому профилю HealthLog. Войдите в WHOOP с аккаунтом, который относится к этому профилю, или сначала отключите его от другого профиля." + }, + "fitbit": "Fitbit", + "fitbitTag": "Fitbit и Pixel", + "fitbitDescription": "Подключите Fitbit, чтобы синхронизировать показатели Fitbit и Pixel Watch: вес, ЧСС и другое.", + "fitbitExperimentalBadge": "Экспериментально", + "fitbitCredentials": "Учётные данные API", + "fitbitClientId": "ID клиента", + "fitbitClientSecret": "Секрет клиента", + "fitbitCredentialsSaved": "Учётные данные сохранены", + "fitbitCredentialsSavedPlaceholder": "Сохранено. Введите новые для замены", + "fitbitCredentialsSavedPlaceholderSecret": "Сохранено. Введите новые для замены", + "fitbitSaveCredentials": "Сохранить", + "fitbitSync": "Синхронизировать сейчас", + "fitbitFullSync": "Синхронизировать все данные", + "fitbitFullSyncTitle": "Полная синхронизация?", + "fitbitFullSyncDescription": "Вся доступная история Fitbit будет полностью синхронизирована. Это может занять некоторое время в зависимости от вашей истории.", + "fitbitSyncResult": "Синхронизировано измерений: {count}", + "fitbitSyncFailed": "Синхронизация не удалась", + "fitbitSynchronize": "Синхронизировать", + "fitbitDisconnect": "Отключить", + "fitbitDisconnectTitle": "Отключить Fitbit?", + "fitbitDisconnectDescription": "Подключение к Fitbit будет разорвано. Ранее синхронизированные данные сохранятся.", + "fitbitConnect": "Подключить Fitbit", + "fitbitNoCredentials": "Введите свои учётные данные API выше, чтобы подключить Fitbit.", + "fitbitOauthConnected": "Fitbit подключён. Первая синхронизация начнётся в фоне.", + "fitbitOauthFailed": "Не удалось подключить Fitbit", + "googleHealth": "Google Health", + "googleHealthTag": "Fitbit и Pixel", + "googleHealthBetaBadge": "Бета", + "googleHealthDescription": "Подключите Fitbit, Pixel Watch и Fitbit Air через свой аккаунт Google: вес, ЧСС, сон и активность. Это заменяет классическое подключение Fitbit, которое Google закрывает в сентябре 2026 года.", + "googleHealthCredentials": "Учётные данные API", + "googleHealthClientId": "ID клиента", + "googleHealthClientSecret": "Секрет клиента", + "googleHealthCredentialsSaved": "Учётные данные сохранены", + "googleHealthCredentialsSavedPlaceholder": "Сохранено. Введите новые для замены", + "googleHealthCredentialsSavedPlaceholderSecret": "Сохранено. Введите новые для замены", + "googleHealthSaveCredentials": "Сохранить", + "googleHealthSync": "Синхронизировать сейчас", + "googleHealthSyncCheckStatus": "Обновить статус", + "googleHealthFullSync": "Синхронизировать все данные", + "googleHealthFullSyncTitle": "Полная синхронизация?", + "googleHealthFullSyncDescription": "Вся доступная история Google Health будет полностью синхронизирована. Это может занять некоторое время в зависимости от вашей истории.", + "googleHealthSyncResult": "Синхронизировано измерений: {count}", + "googleHealthSyncFailed": "Синхронизация не удалась", + "googleHealthSyncInProgress": "Синхронизация выполняется: сохранено измерений: {count}, обработано областей: {completed} из {total}.", + "googleHealthResourceFailuresTitle": "Эти области всё ещё требуют внимания:", + "googleHealthResource": { + "workout": "Тренировки", + "sleep": "Сон", + "boundedMetrics": "Измерения здоровья", + "activity": "Активность", + "heartRate": "ЧСС", + "other": "Другие данные" + }, + "googleHealthReason": { + "collectionFailed": "Google не смог предоставить эти данные. Попробуйте синхронизировать снова позже.", + "tokenFailed": "Подключение истекло. Переподключите Google Health.", + "upsertFailed": "Не удалось сохранить данные. Попробуйте синхронизировать снова.", + "rollupFailed": "Данные получены, но их сводка ещё не обновлена. Попробуйте позже.", + "pageLimit": "Обработана только часть доступной истории. Следующая синхронизация продолжит её.", + "generic": "Эта область не была полностью синхронизирована. Попробуйте снова." + }, + "googleHealthSynchronize": "Синхронизировать", + "googleHealthDisconnect": "Отключить", + "googleHealthDisconnectTitle": "Отключить Google Health?", + "googleHealthDisconnectDescription": "Подключение к Google Health будет разорвано. Ранее синхронизированные данные сохранятся.", + "googleHealthConnect": "Подключить Google", + "googleHealthNoCredentials": "Введите свои учётные данные API выше, чтобы подключить Google Health.", + "googleHealthOauthConnected": "Google Health подключён. Первая синхронизация начнётся в фоне.", + "googleHealthOauthFailed": "Не удалось подключить Google Health", + "googleHealthOauthError": { + "csrf1": "Проверка безопасности не прошла, потому что не было cookie браузера. Начните подключение снова в том же браузере.", + "state": "Ответ от Google не совпал ни с одним открытым запросом на подключение. Начните подключение снова.", + "expired": "Запрос на подключение истёк до завершения. Начните подключение снова.", + "cross_user": "Ответ относится к запросу из другого аккаунта. Перезапустите подключение из своего аккаунта.", + "nocode": "Google не вернул код авторизации. Попробуйте снова и разрешите доступ в диалоге Google.", + "nocreds": "Google Health не настроен. Добавьте свои учётные данные OAuth Google выше и попробуйте снова.", + "token": "Обмен токена с Google не удался. Начните подключение снова.", + "generic": "Неизвестная ошибка при подключении. Начните подключение снова.", + "already_linked": "Этот аккаунт Google уже подключён к другому профилю HealthLog. Войдите в Google с аккаунтом, который относится к этому профилю, или сначала отключите его от другого профиля." + }, + "fitbitOauthError": { + "csrf1": "Проверка безопасности не прошла, потому что не было cookie браузера. Начните подключение снова в том же браузере.", + "state": "Ответ от Fitbit не совпал ни с одним открытым запросом на подключение. Начните подключение снова.", + "expired": "Запрос на подключение истёк до завершения. Начните подключение снова.", + "cross_user": "Ответ относится к запросу из другого аккаунта. Перезапустите подключение из своего аккаунта.", + "nocode": "Fitbit не вернул код авторизации. Попробуйте снова и разрешите доступ в диалоге Fitbit.", + "nocreds": "Fitbit не настроен. Добавьте свои учётные данные OAuth Fitbit выше и попробуйте снова.", + "token": "Обмен токена с Fitbit не удался. Начните подключение снова.", + "generic": "Неизвестная ошибка при подключении. Начните подключение снова.", + "retired": "Google отключил Fitbit Web API, поэтому новое подключение Fitbit невозможно. Подключите вместо этого Google Health, который читает те же устройства.", + "already_linked": "Этот аккаунт Fitbit уже подключён к другому профилю HealthLog. Войдите в Fitbit с аккаунтом, который относится к этому профилю, или сначала отключите его от другого профиля." + }, + "integrations": { + "withings": { + "plan": { + "link": "О тарифах API Withings", + "items": { + "spo2": "SpO2", + "vascularAge": "сосудистый возраст", + "pulseWaveVelocity": "скорость пульсовой волны", + "vo2Max": "VO2 max", + "visceralFat": "висцеральный жир", + "skinTemperature": "температура кожи", + "ecg": "ЭКГ и фибрилляция предсердий", + "sleepScore": "балл сна", + "sleepHrv": "ночная вариабельность сердечного ритма", + "sleepHeartRate": "ночная ЧСС", + "sleepRespiratoryRate": "ночная частота дыхания", + "sleepSpo2": "ночной SpO2", + "bodyTemperature": "температура тела", + "bodyFat": "жировая масса", + "fatMass": "масса жира", + "fatFreeMass": "обезжиренная масса", + "muscleMass": "мышечная масса", + "bodyWater": "вода в организме", + "boneMass": "костная масса", + "heartRate": "ЧСС", + "bloodPressure": "АД", + "weight": "вес" + } + } + }, + "oura": { + "scope": { + "items": { + "vo2max": "VO2 max", + "cardio_age": "сердечно-сосудистый возраст", + "resilience": "устойчивость", + "workout": "тренировки", + "heartrate": "ЧСС" + } + } + } + }, + "integrationPill": { + "justNow": "только что", + "minutesAgo": "{count} мин назад", + "hoursAgo": "{count} ч назад", + "daysAgo": "{count} дн. назад", + "resumeSuccess": "Интеграция возобновлена", + "resumeError": "Не удалось переподключить" + }, + "integrationFreshness": { + "title": "Получены данные", + "summary": "Типов данных: {count}, новейшие {relative}", + "quiet": "Без новых данных: {count}", + "workouts": "Тренировки", + "medicationDoses": "Дозы лекарств" + }, + "integrationFallback": { + "description": "Настроено в этом аккаунте без собственной карточки настроек." + }, + "withingsViewData": "Посмотреть ваши измерения", + "whoopViewData": "Посмотреть ваше восстановление", + "fitbitViewData": "Посмотреть ваш сон", + "googleHealthViewData": "Посмотреть ваши шаги", + "apiTokens": "Токены API", + "apiTokensDescription": "Просматривайте и отзывайте токены для измерений, тренировок, документов и приёма лекарств.", + "measurementsToken": { + "title": "Токены измерений", + "description": "Создайте токен, чтобы весы, мост для часов или ваша система умного дома могли добавлять измерения.", + "detail": "Токен показывается один раз.", + "scopeNote": "Он может только добавлять новые измерения в вашу собственную историю. Он не может читать ваши данные, изменять или удалять что-либо или создавать другой токен. Измерения помечаются как пришедшие с внешнего устройства, чтобы вы могли отличить их позже, и вы всё равно можете исправить их сами.", + "createFailed": "Не удалось создать токен. Попробуйте снова.", + "namePlaceholder": "Название, например Home Assistant", + "appleHealth": { + "label": "Записывать измерения в Apple Health", + "createHint": "Приложение HealthLog на вашем iPhone затем добавит измерения этого токена в Apple Health. Вы можете изменить это позже в списке токенов ниже.", + "toggleAria": "Записывать измерения из {name} в Apple Health", + "updateFailed": "Не удалось изменить настройку Apple Health. Попробуйте снова.", + "unattributed": "Измерения, отправленные до появления этой настройки, нельзя сопоставить с токеном, поэтому они не попадают в Apple Health." + } + }, + "workoutsToken": { + "title": "Токены тренировок", + "description": "Создайте токен, чтобы мост для часов или скрипт синхронизации могли добавлять ваши тренировки.", + "detail": "Токен показывается один раз.", + "scopeNote": "Он может только добавлять новые тренировки в вашу собственную историю. Он не может читать ваши данные, изменять или удалять что-либо или создавать другой токен. Добавленные им тренировки помечаются как пришедшие с внешнего устройства, и если ваш телефон записал ту же сессию, вы видите копию с телефона.", + "createFailed": "Не удалось создать токен. Попробуйте снова.", + "namePlaceholder": "Название, например Garmin" + }, + "documentsToken": { + "title": "Токены документов", + "description": "Создайте токен, чтобы Paperless-ngx, Papra или скрипт импорта могли добавлять документы в ваше хранилище.", + "detail": "Токен показывается один раз.", + "scopeNote": "Он может только добавлять новые документы в ваше собственное хранилище. Он не может перечислять, открывать, скачивать, изменять или удалять что-либо, и не может создать другой токен. В ответ он получает только то, был ли файл сохранён, а не то, как вы его разложили.", + "createFailed": "Не удалось создать токен. Попробуйте снова.", + "namePlaceholder": "Название, например Paperless-ngx" + }, + "tokenMintMovedDescription": "Токены выдаются там, где они применяются: выше для измерений, тренировок и документов или в собственном API-эндпоинте лекарства для этого одного лекарства.", + "tokenCreated": "Токен создан. Скопируйте его сейчас! Он больше не будет показан.", + "tokenCopy": "Копировать токен", + "tokenCopied": "Токен скопирован в буфер обмена", + "tokenCopyFailed": "Не удалось скопировать токен", + "tokenRevokeFailed": "Не удалось отозвать токен. Попробуйте снова.", + "tokenRevoke": "Отозвать токен?", + "tokenRevokeAction": "Отозвать токен", + "tokenRevokeDescription": "Токен будет безвозвратно деактивирован. Приложения, использующие его, потеряют доступ.", + "tokenRevoked": "Отозван", + "tokenExpired": "Истёк", + "tokenActive": "Активен", + "activeTokensTitle": "Активные токены", + "revokedTokensTitle": "Отозванные токены ({count})", + "tokenTableName": "Название", + "tokenTablePermissions": "Разрешения", + "tokenTableStatus": "Статус", + "tokenTableCreated": "Создан", + "tokenTableLastUsed": "Последнее использование", + "tokenTableActions": "Действия", + "noActiveTokens": "Активных токенов нет.", + "tokenNeverUsed": "Никогда", + "apiEndpointsTitle": "Эндпоинты API", + "apiEndpointsDescription": "Обзор доступных внешних эндпоинтов для загрузки данных по токену.", + "apiEndpointMethod": "Метод", + "apiEndpointPath": "Путь", + "apiEndpointAuth": "Аутентификация", + "apiEndpointExample": "Пример тела запроса", + "dangerZone": "Удалить все данные", + "dangerZoneDescription": "Стирает всю вашу историю здоровья и все подключения интеграций.", + "dangerZoneConfirm": "Удалить все данные?", + "dangerZoneConfirmDescription": "Это безвозвратно удалит всё в вашей записи: измерения, лекарства, записи настроения, результаты анализов, записи цикла, документы, диалоги с ИИ и все подключения интеграций, а также всё, что из них получено, и всё, что вы удалили ранее. Ссылки для врача, которыми вы поделились, сразу перестанут работать. Ваш аккаунт сохранится вместе с данными для входа и настройками отображения, такими как язык, часовой пояс и единицы. Это нельзя отменить.", + "dangerZoneSuccess": "Ваша история здоровья удалена. Аккаунт и вход не изменились.", + "dangerZoneDeleteFailed": "Не удалось удалить", + "finalDelete": "Удалить навсегда", + "deleteAccountCardTitle": "Удалить аккаунт полностью", + "deleteAccountCardDescription": "Удаляет ваш аккаунт вместе с ключами доступа, журналом аудита и сеансами.", + "deleteAccountCta": "Удалить аккаунт", + "deleteAccountConfirmTitle": "Удалить аккаунт навсегда?", + "deleteAccountConfirmTitleGrace": "Удалить ваш аккаунт?", + "deleteAccountConfirmDescription": "Ваш аккаунт, все данные о здоровье, ключи доступа, сеансы и записи аудита будут безвозвратно удалены. Сразу после этого вы выйдете из аккаунта. Копии в резервных копиях этого сервера истекают по истечении срока хранения.", + "deleteAccountSuccess": "Аккаунт удалён. Выполняется выход.", + "deleteAccountFailed": "Не удалось удалить аккаунт", + "deleteAccountFinal": "Удалить навсегда", + "deleteAccountFinalGrace": "Удалить аккаунт", + "saved": "Сохранено", + "savingError": "Ошибка сохранения", + "about": { + "version": "Версия приложения", + "gitSha": "Сборка", + "builtAtLabel": "Собрано", + "license": "Лицензия", + "repository": "Исходный код", + "changelog": "Список изменений", + "docs": "Документация", + "credits": "Благодарности и источники данных", + "linksHeading": "Источники и документация", + "newerAvailable": "Доступна новая версия: {tag}", + "support": { + "title": "Поддержка", + "description": "Сводка для сообщения об ошибке, без вашего имени, адреса электронной почты и значений здоровья.", + "copy": "Копировать сведения для поддержки", + "copied": "Скопировано", + "copyFailed": "Не удалось собрать сведения для поддержки." + } + }, + "testConnection": { + "test": "Проверить подключение", + "saveFirst": "Сначала сохраните изменения. Проверка использует сохранённые настройки.", + "testing": "Проверка…", + "ok": "Подключено (задержка {latency} мс)", + "errors": { + "credentials_rejected": "Учётные данные отклонены. Проверьте токен", + "rate_limited": "Превышен лимит запросов на стороне сервиса", + "timeout": "Время ожидания запроса истекло", + "upstream_error": "Сервис вернул ошибку", + "upstream_rejected": "Другая сторона отклонила сообщение", + "connection_failed": "Не удалось подключиться", + "not_configured": "Не настроено", + "url_not_public": "URL не является публичным эндпоинтом", + "private_origin_not_approved": "Цель в частной сети. Оператор должен добавить этот источник в NOTIFICATION_PRIVATE_ORIGINS", + "private_origin_not_grantable": "Этот адрес link-local, метаданных или неопределённый; никакое разрешение оператора его не откроет. Используйте адрес, на котором слушает ретранслятор", + "url_invalid": "URL недействителен", + "redirected": "Эндпоинт перенаправляет. Проверьте URL", + "endpoint_not_found": "Эндпоинт по URL не найден", + "credentials_unreadable": "Не удалось расшифровать учётные данные", + "upstream_invalid_json": "Сервис прислал недействительный JSON", + "vapid_not_configured": "Web Push не настроен (отсутствуют ключи VAPID)", + "rate_limited_self": "Слишком много тестовых запросов", + "generic": "Проверка не удалась" + } + }, + "notificationStatus": { + "title": "Статус доставки", + "description": "Состояние каждого канала; «Автоотключён» означает, что повторы прекратились после постоянных ошибок.", + "emptyDescription": "Настройте канал в разделе Настройки › Интеграции › Каналы доставки.", + "stateActive": "Активно", + "stateAutoDisabled": "Автоотключён", + "stateSendingPaused": "Отправка приостановлена", + "stateManuallyDisabled": "Выключено", + "lastSuccess": "Последняя успешная отправка", + "lastFailure": "Последняя ошибка", + "consecutiveFailures": "Ошибок подряд", + "disabledReason": "Причина", + "nextRetry": "Следующий повтор", + "reEnable": "Включить снова", + "sendTest": "Отправить тест", + "emptyTitle": "Каналы ещё не настроены" + }, + "identity": { + "description": "Необязательные данные для экспорта истории здоровья (обложка PDF + экспорт FHIR). Все поля необязательны.", + "fullName": "Полное имя", + "fullNamePlaceholder": "например, Анна Иванова", + "insurer": "Страховая компания", + "insurerPlaceholder": "например, СОГАЗ", + "insuranceNumber": "Номер полиса (KVNR)", + "insuranceNumberHint": "10 символов: одна буква + девять цифр (например, A123456780)." + }, + "healthRecord": { + "title": "Экспорт истории здоровья", + "description": "Полная запись для вашего врача: в виде PDF, FHIR или и то и другое.", + "format": "Формат", + "format_pdf": "PDF", + "format_fhir": "Структурированный (FHIR)", + "format_package": "Пакет: PDF + FHIR", + "range": "Период", + "range90": "Последние 90 дней", + "range180": "Последние 6 месяцев", + "range365": "Последние 12 месяцев", + "practiceName": "Клиника (необязательно)", + "practiceNamePlaceholder": "например, д-р Смирнов", + "includedData": "Включаемые данные", + "includeCharts": "Встроить графики динамики (только PDF)", + "fhirNote": "Структурированный вывод соответствует стандарту FHIR R4 (совместим с ePA).", + "generate": "Сформировать", + "documentsLink": "Документы за этот период", + "range30": "Последние 30 дней", + "rangeCustom": "Свой период", + "rangeCustomStart": "С", + "rangeCustomEnd": "По", + "errorGeneric": "Не удалось сформировать экспорт. Попробуйте ещё раз.", + "errorRateLimit": "Вы достигли лимита экспорта на этот час.", + "errorModuleDisabled": "Экспорт истории здоровья выключен для этого аккаунта.", + "visitOffer": "Предстоит приём {when}: {what}.", + "visitOfferApplyWindow": "Использовать этот период" + }, + "globalExcludedInjectionSitesLabel": "Глобально исключённые места инъекции", + "globalExcludedInjectionSitesHint": "Никогда не предлагаются и отклоняются при записи дозы, даже если лекарство предпочитает их.", + "sharing": { + "createTitle": "Новая ссылка общего доступа", + "createDescription": "Ссылка доступна только для чтения и ограничена по времени.", + "label": "Название", + "labelPlaceholder": "например, д-р Смирнов, ежегодный осмотр", + "range": "Дней истории", + "rangeHint": "Насколько глубоко охватывает общий период.", + "expiry": "Истекает через (дней)", + "expiryHint": "Не более {max} дней.", + "expiryInvalid": "Срок действия должен быть от 1 до {max} дней.", + "create": "Создать ссылку", + "tokenCreated": "Ссылка общего доступа создана", + "copied": "Скопировано в буфер обмена", + "activeTitle": "Активные ссылки", + "noActive": "Активных ссылок общего доступа нет.", + "created": "Создана", + "expires": "Истекает", + "accessCount": "Просмотры", + "revoke": "Отозвать", + "revokeDescription": "Отозвать эту ссылку немедленно. Любой, у кого она есть, сразу потеряет доступ. Это нельзя отменить.", + "statusActive": "Активна", + "statusRevoked": "Отозвана", + "statusExpired": "Истекла", + "inactiveTitle": "Отозванные и истёкшие ({count})", + "shownOnce": "Показывается только один раз. Сохраните QR-код и парольную фразу сейчас; позже их нельзя будет восстановить.", + "qrAlt": "QR-код со ссылкой общего доступа и парольной фразой", + "linkLabel": "Ссылка", + "passphraseLabel": "Парольная фраза", + "passphraseHint": "Получателю нужны и ссылка, и эта парольная фраза. QR-код содержит и то и другое.", + "copyLink": "Копировать ссылку", + "copyPassphrase": "Копировать парольную фразу", + "protected": "Парольная фраза", + "attachTitle": "Прикрепить документы", + "attachButton": "Выбрать документы", + "attachCount": "Выбрано {count} из {max}", + "attachFrozen": "Набор документов фиксируется после создания ссылки. Добавить или убрать документы потом нельзя.", + "attachRemove": "Убрать {title}", + "exifNote": "Метаданные камеры (EXIF/GPS) удаляются из изображений JPEG, PNG и WebP при публикации. Файлы PDF, TIFF, HEIC и Office передаются без изменений.", + "documentCount": "Прикреплённые документы: {count}", + "qrScanTitle": "Отсканируйте, чтобы открыть на другом устройстве", + "qrScanHint": "Наведите камеру телефона на код, чтобы открыть общую запись. Парольная фраза уже включена.", + "pickerTitle": "Прикрепить документы", + "pickerDescription": "Найдите в хранилище и выберите документы для публикации. До {max}.", + "pickerSearch": "Поиск документов", + "pickerEmpty": "Документы не найдены.", + "pickerDone": "Готово", + "pickerSelectedCount": "Выбрано {count} из {max}", + "pickerMaxReached": "Вы достигли максимума в {max} документов.", + "scopeTitle": "Что содержит эта ссылка", + "scopeInsuranceExcluded": "Данные страхования никогда не передаются по ссылке.", + "statusNeedsReselect": "Выберите содержимое заново", + "reselectReason": "Эта ссылка отдавала область, которую никто не выбирал, поэтому она была закрыта. Создайте новую и выберите, что она должна содержать.", + "reselectAction": "Создать замену", + "createDetail": "Токен показывается один раз при создании. Сохраните его тогда же; восстановить его нельзя.", + "activeDescription": "Ссылки, которыми вы поделились, когда они истекают и как часто их открывали.", + "revokedToast": "Ссылка отозвана.", + "revokeFailed": "Не удалось отозвать ссылку." + }, + "genderOther": "Другой", + "nightscout": "Nightscout", + "nightscoutTag": "CGM", + "nightscoutDescription": "Подключите свой сайт Nightscout, чтобы синхронизировать непрерывные измерения глюкозы в панель глюкозы.", + "nightscoutViewData": "Посмотреть глюкозу", + "nightscoutUrl": "URL Nightscout", + "nightscoutUrlSavedPlaceholder": "Сохранено. Введите новый URL, чтобы заменить", + "nightscoutToken": "Токен API", + "nightscoutTokenOptional": "Необязательно для публичного сайта", + "nightscoutTokenSavedPlaceholder": "Сохранено. Введите новый токен, чтобы заменить", + "nightscoutTokenHelp": "Вставьте токен доступа из инструментов администратора Nightscout. Оставьте пустым, если ваш сайт доступен публично для чтения.", + "nightscoutPrivateOperatorTitle": "Доступ к приватному Nightscout требует одобрения оператора сервера.", + "nightscoutPrivateOperatorDescription": "Попросите оператора сервера одобрить именно этот источник Nightscout.", + "nightscoutConnect": "Подключить", + "nightscoutUpdate": "Сохранить изменения", + "nightscoutConnected": "Nightscout подключён.", + "nightscoutConnectFailed": "Не удалось подключиться к Nightscout.", + "nightscoutSync": "Синхронизировать сейчас", + "nightscoutSyncResult": "Синхронизировано измерений: {count}", + "nightscoutSyncFailed": "Синхронизация не удалась", + "nightscoutDisconnect": "Отключить", + "nightscoutDisconnectTitle": "Отключить Nightscout?", + "nightscoutDisconnectDescription": "Будущие синхронизации прекратятся. Уже импортированные измерения глюкозы останутся в истории.", + "polar": "Polar", + "polarDescription": "Подключите аккаунт Polar, чтобы синхронизировать восстановление Nightly Recharge, фазы сна, дневную активность и тренировки.", + "polarViewData": "Посмотреть сон и восстановление", + "polarCredentials": "Учётные данные API", + "polarClientId": "ID клиента", + "polarClientSecret": "Секрет клиента", + "polarCredentialsSaved": "Учётные данные сохранены", + "polarCredentialsSavedPlaceholder": "Сохранено. Введите новые, чтобы заменить", + "polarSaveCredentials": "Сохранить", + "polarUnavailable": "Polar не настроен на этом сервере. Добавьте свои учётные данные OAuth Polar выше или попросите администратора настроить общее приложение.", + "polarConnect": "Подключить Polar", + "polarSync": "Синхронизировать сейчас", + "polarSyncResult": "Синхронизировано измерений: {count}", + "polarSyncFailed": "Синхронизация не удалась", + "polarDisconnect": "Отключить", + "polarDisconnectTitle": "Отключить Polar?", + "polarDisconnectDescription": "Будущие синхронизации прекратятся. Уже импортированные измерения останутся в истории.", + "polarOauthConnected": "Polar подключён. Первая синхронизация начнётся в фоне.", + "polarOauthFailed": "Не удалось подключить Polar", + "polarOauthError": { + "csrf1": "Проверка безопасности не прошла из-за отсутствия cookie браузера. Начните подключение заново в том же браузере.", + "state": "Ответ от Polar не совпал ни с одним открытым запросом на подключение. Начните подключение заново.", + "cross_user": "Ответ относится к запросу из другого аккаунта. Перезапустите подключение из своего аккаунта.", + "nocode": "Polar не вернул код авторизации. Попробуйте снова и разрешите доступ в диалоге Polar.", + "nocreds": "Polar не настроен на этом сервере. Попросите администратора добавить учётные данные OAuth Polar.", + "token": "Обмен токена с Polar не удался. Начните подключение заново.", + "rate_limited": "Слишком много попыток подключения. Подождите немного и попробуйте снова.", + "generic": "Неизвестная ошибка при подключении. Начните подключение заново.", + "already_linked": "Этот аккаунт Polar уже подключён к другому профилю HealthLog. Войдите в Polar с аккаунтом, который принадлежит этому профилю, или сначала отключите его от другого профиля." + }, + "oura": "Oura", + "ouraDescription": "Подключите аккаунт Oura, чтобы синхронизировать готовность, фазы сна, вариабельность сердечного ритма и дневную активность.", + "ouraViewData": "Посмотреть сон и восстановление", + "ouraCredentials": "Учётные данные API", + "ouraClientId": "ID клиента", + "ouraClientSecret": "Секрет клиента", + "ouraCredentialsSaved": "Учётные данные сохранены", + "ouraCredentialsSavedPlaceholder": "Сохранено. Введите новые, чтобы заменить", + "ouraSaveCredentials": "Сохранить", + "ouraUnavailable": "Oura не настроена на этом сервере. Добавьте свои учётные данные OAuth Oura выше или попросите администратора настроить общее приложение.", + "ouraConnect": "Подключить Oura", + "ouraSync": "Синхронизировать сейчас", + "ouraSyncResult": "Синхронизировано измерений: {count}", + "ouraSyncFailed": "Синхронизация не удалась", + "ouraDisconnect": "Отключить", + "ouraDisconnectTitle": "Отключить Oura?", + "ouraDisconnectDescription": "Будущие синхронизации прекратятся. Уже импортированные измерения останутся в истории.", + "ouraOauthConnected": "Oura подключена. Первая синхронизация начнётся в фоне.", + "ouraOauthFailed": "Не удалось подключить Oura", + "ouraOauthError": { + "csrf1": "Проверка безопасности не прошла из-за отсутствия cookie браузера. Начните подключение заново в том же браузере.", + "state": "Ответ от Oura не совпал ни с одним открытым запросом на подключение. Начните подключение заново.", + "cross_user": "Ответ относится к запросу из другого аккаунта. Перезапустите подключение из своего аккаунта.", + "nocode": "Oura не вернула код авторизации. Попробуйте снова и разрешите доступ в диалоге Oura.", + "nocreds": "Oura не настроена на этом сервере. Попросите администратора добавить учётные данные OAuth Oura.", + "token": "Обмен токена с Oura не удался. Начните подключение заново.", + "rate_limited": "Слишком много попыток подключения. Подождите немного и попробуйте снова.", + "issuer": "Ответ на вход пришёл не от собственного сервера авторизации Oura, поэтому подключение остановлено для вашей безопасности. Начните подключение заново. Если это повторяется, сообщите администратору.", + "generic": "Неизвестная ошибка при подключении. Начните подключение заново.", + "already_linked": "Этот аккаунт Oura уже подключён к другому профилю HealthLog. Войдите в Oura с аккаунтом, который принадлежит этому профилю, или сначала отключите его от другого профиля." + }, + "integrationSetupGuide": "Инструкция по настройке", + "coach": { + "memory": { + "edit": "Изменить", + "source": { + "user": "от вас", + "coach": "от Коуча" + } + }, + "state": { + "title": "Тренер", + "description": "Показывать ли кнопку и панель Коуча. Переключатель находится в разделе Модули." + }, + "nudgesMoved": "Настраивается вместе с другими напоминаниями в разделе Уведомления.", + "openNudges": "Открыть в Уведомлениях" + }, + "integrationRedirectGuide": { + "intro": "Подключение идёт через ваше собственное приложение разработчика {provider}, настройка занимает около 5 минут:", + "step1": "Создайте приложение в портале разработчика {provider}.", + "step2": "Укажите его redirect / callback URL:", + "step3": "Вставьте выданные им client ID и client secret выше." + }, + "security": { + "sessionsTitle": "Активные сеансы", + "sessionsDescription": "Устройства и браузеры, в которых сейчас выполнен вход в ваш аккаунт.", + "sessionsLoadError": "Не удалось загрузить активные сеансы.", + "sessionsEmpty": "Активных сеансов нет.", + "currentSession": "Это устройство", + "lastActive": "Последняя активность {time}", + "unknownLocation": "Неизвестное местоположение", + "revokeSession": "Выйти", + "revokeError": "Не удалось выполнить запрос. Попробуйте ещё раз.", + "signOutEverywhere": "Выйти на всех остальных устройствах", + "signOutEverywhereDone": "Выполнен выход из других сеансов: {count}", + "activityTitle": "Активность безопасности", + "activityDescription": "Недавние входы, изменения безопасности и экспорт данных в вашем аккаунте.", + "activityEmpty": "Активности безопасности пока нет.", + "activityLoadError": "Не удалось загрузить активность безопасности.", + "action": { + "newDevice": "Вход с нового устройства", + "loginFailed": "Неудачный вход", + "login": "Вход", + "passwordChange": "Пароль изменён", + "mfa": "Изменение двухфакторной аутентификации", + "sessionRevoke": "Выход из сеанса", + "token": "Изменение токена API", + "accountDelete": "Аккаунт удалён", + "dataClear": "Сброс данных", + "export": "Экспорт данных", + "other": "Событие безопасности" + }, + "active": "Активно", + "inactive": "Неактивно", + "stepUpRequired": "Для вашей безопасности войдите снова, чтобы изменить второй фактор.", + "useRecoveryCode": "Использовать код восстановления", + "useAuthenticator": "Использовать приложение-аутентификатор", + "totp": { + "title": "Приложение-аутентификатор", + "description": "Используйте одноразовый код из приложения-аутентификатора как второй фактор.", + "setUp": "Настроить", + "step1": "Отсканируйте QR-код приложением-аутентификатором или введите секрет вручную.", + "step2": "Введите 6-значный код, который показывает приложение, для подтверждения.", + "qrAlt": "QR-код для настройки приложения-аутентификатора", + "qrUnavailable": "QR-код недоступен", + "manualEntry": "Или введите этот секрет вручную", + "enterCode": "Введите 6-значный код", + "verify": "Подтвердить", + "setupFailed": "Не удалось начать настройку. Попробуйте ещё раз.", + "invalidCode": "Этот код недействителен. Попробуйте ещё раз.", + "disable": "Выключить", + "disableTitle": "Выключить двухфакторную аутентификацию", + "disableConfirm": "Введите текущий код, чтобы выключить второй фактор. Это также удалит ваши коды восстановления.", + "currentCode": "Текущий код", + "disableFailed": "Не удалось выключить второй фактор." + }, + "recovery": { + "saveNow": "Сохраните эти коды восстановления сейчас", + "saveNowHint": "Каждый код работает один раз. Они показываются только сейчас. Храните их в надёжном месте. Если вы потеряете аутентификатор, код восстановления — единственный способ войти.", + "download": "Скачать", + "remainingOne": "Остался {count} код восстановления.", + "remainingOther": "Осталось кодов восстановления: {count}.", + "regenerate": "Создать коды заново", + "regenFailed": "Не удалось создать коды восстановления заново.", + "savedIt": "Я их сохранил", + "regenerateTitle": "Создать коды восстановления заново?", + "regenerateConfirm": "Это заменит ваши текущие коды восстановления. Существующие коды сразу перестанут работать, а новый набор показывается только один раз." + }, + "keys": { + "title": "Ключи безопасности", + "description": "Зарегистрируйте аппаратный или платформенный ключ безопасности как второй фактор.", + "empty": "Ключи безопасности ещё не зарегистрированы.", + "add": "Добавить ключ безопасности", + "addFailed": "Не удалось зарегистрировать ключ безопасности.", + "rename": "Переименовать", + "renameFailed": "Не удалось переименовать ключ безопасности.", + "remove": "Убрать ключ безопасности", + "removeFailed": "Не удалось убрать ключ безопасности.", + "removeConfirm": "Этот ключ безопасности больше не будет работать как второй фактор.", + "lastUsed": "Последнее использование {date}", + "neverUsed": "Никогда не использовался", + "added": "добавлен {date}", + "nameLabel": "Название ключа безопасности", + "addedToast": "Ключ безопасности добавлен.", + "removedToast": "Ключ безопасности убран." + }, + "passkeyNudge": { + "title": "Добавьте ключ доступа для более быстрого входа", + "body": "Ключи доступа позволяют входить по отпечатку пальца, лицу или PIN-коду устройства, без пароля, который нужно помнить." + }, + "trustedDevices": { + "title": "Доверенные устройства", + "description": "Браузеры, которым вы доверились, пропускают второй фактор в течение 30 дней. Пароль по-прежнему требуется. Отзовите те, которые не узнаёте.", + "loadError": "Не удалось загрузить доверенные устройства.", + "revokeError": "Не удалось отозвать устройство. Попробуйте ещё раз.", + "revoke": "Отозвать", + "revokeAll": "Забыть все устройства", + "revokeAllDone": "Забыто доверенных устройств: {count}", + "unnamed": "Неизвестное устройство", + "current": "Это устройство", + "expires": "Доверено до {date}", + "revokeConfirmTitle": "Перестать доверять этому устройству?", + "revokeConfirmBody": "При следующем входе с него снова потребуется ваш второй фактор.", + "revokeAllConfirmTitle": "Перестать доверять всем устройствам?", + "revokeAllConfirmBody": "При следующем входе с каждого устройства снова потребуется ваш второй фактор, включая это." + }, + "revokeSessionConfirmTitle": "Выйти на этом устройстве?", + "revokeSessionConfirmBody": "{device} потребуется войти снова. Записи на нём не затрагиваются.", + "signOutEverywhereConfirmTitle": "Выйти на всех остальных устройствах?", + "signOutEverywhereConfirmBody": "Каждому другому устройству, каждому подключённому ИИ-ассистенту и каждому токену API потребуется войти или быть настроенным заново. Это устройство останется в системе. Записанные вами данные не затрагиваются.", + "signOutEverywhereShareLinks": "Также завершить ссылки общего доступа для врача", + "signOutEverywhereInvites": "Приглашения к вашей записи, которые ещё никто не принял, отзываются. Те, кто уже принял, сохраняют доступ; вы можете завершить его следующим шагом.", + "signOutEverywhereInvitesDone": "Отозвано приглашений, которые никто не принял: {count}.", + "grantsKeptTitle": "Эти люди по-прежнему видят вашу запись", + "grantsKeptBody": "Выход не завершает доступ, который вы кому-то дали. Завершите его здесь, если вы его не давали или больше не хотите, чтобы у них был доступ." + }, + "privacy": { + "encryption": { + "title": "Шифрование при хранении", + "summary": "Ваши чувствительные данные зашифрованы при хранении с помощью {algorithm} в {columns} полях в {models} типах записей.", + "statement": "Ваши чувствительные данные зашифрованы при хранении с помощью AES-256-GCM." + }, + "stored": { + "title": "Что хранится", + "measurements": "Измерения: вес, АД, пульс и любое другое значение, которое записываете вы или устройство", + "integrations": "Токены интеграций (зашифрованы)", + "security": "Активность аккаунта и безопасности (сеансы, журнал входов)", + "profile": "Ваш профиль, медицинский анамнез и данные истории здоровья", + "modules": "Записи каждого модуля: {list}" + }, + "workoutRoutes": { + "title": "Маршруты тренировок", + "description": "Сохранять GPS-трек новых тренировок из приложения для iPhone и экспорта Apple Health.", + "detail": "Выключено для новых аккаунтов. Маршрут показывает, где вы живёте, работаете и тренируетесь, поэтому он сохраняется только после включения. Тренировки сохраняются в любом случае, и ни одна функция ИИ не читает маршрут. Выключение останавливает новые маршруты; уже сохранённые остаются, пока вы не удалите тренировку.", + "loadError": "Не удалось загрузить настройку маршрутов." + }, + "retention": { + "title": "Срок хранения", + "description": "Как долго хранятся записи с ограниченным сроком до автоматической очистки.", + "coach": "Диалоги с Коучем: хранятся {days} дней", + "audit": "Журнал активности безопасности: хранится {days} дней", + "delivery": "Журнал доставки уведомлений: хранится {days} дней", + "unavailable": "Сведения о сроках хранения сейчас недоступны.", + "accountDeletion": "Удаление аккаунта, управляемого профиля или всех данных: завершается через {days} дней", + "accountDeletionImmediate": "Удаление аккаунта, управляемого профиля или всех данных: завершается сразу" + }, + "delete": { + "title": "Удалить или сбросить", + "description": "Удалить аккаунт полностью или стереть историю здоровья, сохранив аккаунт.", + "openAdvanced": "Удалить или сбросить", + "immediateNotice": "Удаление сразу убирает ваши данные. Если этот сервер хранит зашифрованные резервные копии вне хоста, копии ваших данных удаляются из этого хранилища сразу после, или при следующем ночном запуске, если хранилище недоступно. Копии в резервных копиях этого сервера истекают по истечении срока хранения.", + "graceNotice": "При удалении аккаунта он сразу блокируется и стирается через {days} дней вместе со всеми копиями, которые этот сервер хранит, включая зашифрованные копии вне хоста. До этого администратор этого сервера может отменить удаление. Удаление всех данных работает так же: копия записи хранится {days} дней, чтобы администратор мог её восстановить. Копии в резервных копиях этого сервера истекают по истечении срока хранения." + }, + "posture": { + "title": "Политика конфиденциальности", + "description": "Управляйте тем, какая часть ваших данных передаётся функциям ИИ.", + "openAi": "Режим конфиденциальности ИИ" + }, + "sessions": { + "title": "Сеансы и устройства", + "description": "Где вы вошли, устройства, пропускающие второй фактор, и активность безопасности вашего аккаунта.", + "open": "Открыть безопасность" + } + }, + "mcp": { + "enableTitle": "Удалённый эндпоинт MCP", + "enableDescription": "Разрешить ассистенту с поддержкой MCP (Claude.ai, ChatGPT) читать ваши данные о здоровье по токену с ограниченной областью.", + "endpointLabel": "URL коннектора", + "connectDescription": "Вставьте этот URL в настройку пользовательского коннектора вашего ассистента, затем авторизуйтесь токеном ниже или войдите по запросу.", + "tokensTitle": "Токены коннектора", + "tokensDescription": "Создайте токен для подключения ассистента, только для чтения, если вы не разрешите запись ниже.", + "scopeNote": "Новые токены могут только читать ваши собственные записи. Доступ на запись (health:write) выдаётся для каждого токена переключателем ниже. Токен никогда не получает доступ к функциям администратора.", + "writeScopeToggleLabel": "Разрешить запись (health:write)", + "writeScopeNote": "Добавляет область health:write, чтобы ассистент мог записывать новые измерения и записи настроения в ваш аккаунт. Каждая запись сначала подтверждается. Токен по-прежнему не может удалять или изменять существующие записи, менять лекарства или получать доступ к REST или функциям администратора. Оставьте выключенным для доступа только для чтения.", + "connectionsTitle": "Подключённые ассистенты", + "connectionsDescription": "Ассистенты, которых вы авторизовали через процесс входа.", + "noConnections": "Подключённых ассистентов нет.", + "connectionConnected": "Подключено", + "connectionLastUsed": "Последнее использование", + "connectionNeverUsed": "Никогда не использовался", + "connectionRevoke": "Отключить", + "connectionRevokeDescription": "Это сразу завершает доступ ассистента и не даёт ему продлеваться. Для повторного подключения потребуется авторизовать его заново.", + "connectionRevokeFailed": "Не удалось отключить ассистента.", + "connectionsDetail": "Отзыв подключения сразу завершает его доступ, включая возможность обновления.", + "tokensDetail": "Токен показывается один раз.", + "tokenNamePlaceholder": "Название, например Claude Desktop", + "offKeepsTokens": "Выключение приостанавливает эндпоинт. Ваши токены и подключения сохраняются и снова работают после включения." + }, + "strava": "Strava", + "stravaDescription": "Подключите аккаунт Strava, чтобы синхронизировать активности в историю тренировок.", + "stravaViewData": "Посмотреть тренировки", + "stravaCredentials": "Учётные данные API", + "stravaClientId": "ID клиента", + "stravaClientSecret": "Секрет клиента", + "stravaCredentialsSaved": "Учётные данные сохранены", + "stravaCredentialsSavedPlaceholder": "Сохранено. Введите новые, чтобы заменить", + "stravaSaveCredentials": "Сохранить", + "stravaUnavailable": "Strava не настроена на этом сервере. Добавьте свои учётные данные API Strava выше или попросите администратора настроить общее приложение.", + "stravaConnect": "Подключить Strava", + "stravaSync": "Синхронизировать сейчас", + "stravaSyncResult": "Синхронизировано измерений: {count}", + "stravaSyncFailed": "Синхронизация не удалась", + "stravaDisconnect": "Отключить", + "stravaDisconnectTitle": "Отключить Strava?", + "stravaDisconnectDescription": "Будущие синхронизации прекратятся. Уже импортированные активности останутся в истории.", + "stravaOauthConnected": "Strava подключена. Первая синхронизация начнётся в фоне.", + "stravaOauthFailed": "Не удалось подключить Strava", + "stravaOauthError": { + "csrf1": "Проверка безопасности не прошла из-за отсутствия cookie браузера. Начните подключение заново в том же браузере.", + "state": "Ответ от Strava не совпал ни с одним открытым запросом на подключение. Начните подключение заново.", + "cross_user": "Ответ относится к запросу из другого аккаунта. Перезапустите подключение из своего аккаунта.", + "nocode": "Strava не вернула код авторизации. Попробуйте снова и разрешите доступ в диалоге Strava.", + "nocreds": "Strava не настроена на этом сервере. Попросите администратора добавить учётные данные API Strava.", + "token": "Обмен токена со Strava не удался. Начните подключение заново.", + "rate_limited": "Слишком много попыток подключения. Подождите немного и попробуйте снова.", + "generic": "Неизвестная ошибка при подключении. Начните подключение заново.", + "already_linked": "Этот аккаунт Strava уже подключён к другому профилю HealthLog. Войдите в Strava с аккаунтом, который принадлежит этому профилю, или сначала отключите его от другого профиля." + }, + "appleHealth": { + "title": "Apple Health", + "description": "Живая синхронизация идёт из приложения HealthLog для iOS, а не из веб- или OAuth-подключения.", + "status": { + "unavailable": "Статус Apple Health недоступен" + }, + "setupTitle": "Включить живую синхронизацию", + "permissionStep": "В приложении HealthLog для iOS откройте Настройки → Apple Health и разрешите категории здоровья, которыми хотите поделиться.", + "backgroundStep": "Оставьте включённым «Обновление контента». Приложение синхронизирует новые данные автоматически на переднем плане и когда iOS выделяет время для фоновой работы.", + "importNote": "Нужна более старая история или не можете использовать приложение для iOS? Загрузка XML/ZIP Apple Health — разовый запасной вариант и не включает живую синхронизацию.", + "importAction": "Открыть разовый импорт", + "progress": { + "title": "Ход синхронизации", + "receivedLabel": "Получено записей", + "oldestLabel": "Достигнуто самое старое измерение", + "flowing": "Данные пришли за последний час. Приложение для iPhone всё ещё передаёт.", + "waiting": "Ожидание новых данных от приложения для iPhone. Передача продолжается, когда приложение открыто или когда iOS выделяет ему фоновое время. Затишье во время первой большой догрузки — это нормально, а не ошибка." + }, + "delivery": { + "title": "Доставка", + "lastTriggerLabel": "Последняя синхронизация пришла", + "lastBackgroundLabel": "Последняя фоновая синхронизация", + "backgroundNever": "Никогда: все синхронизации до сих пор приходили при открытом приложении", + "noSyncYet": "Синхронизация ещё не приходила, поэтому здесь нечего сообщать.", + "trigger": { + "foreground": "при открытом приложении", + "background": "в фоне", + "push": "по push-пробуждению", + "unknown": "триггер не сообщён приложением", + "manual": "из «Синхронизировать всё»" + } + }, + "freshness": { + "title": "По типу данных", + "lastReceived": "Последнее получение {relative}", + "lastNewValue": "Последнее новое значение {relative}", + "lastBackground": "Последнее в фоне {relative}", + "lastDuplicate": "Последняя повторная отправка без нового {relative}", + "never": "Ещё не получено", + "lastBackfill": "История догружена {relative}", + "lastEnteredHere": "Последний ввод здесь {relative}" + } + }, + "garminInfo": { + "title": "Garmin", + "body": "У Garmin здесь нет прямого подключения. Подключайтесь через Apple Health (iOS) или Google Health Connect (Android). Собственные показатели Garmin (Body Battery, Training Load, HRV Status, VO₂ max) Garmin не передаёт ни на одну из платформ.", + "docsLink": "Прочитать руководство" + }, + "glucoseReference": { + "title": "Референсный диапазон глюкозы", + "description": "По какому диапазону оцениваются ваши измерения глюкозы крови.", + "enable": "Использовать целевой диапазон при диабете", + "explainer": "Выключено — измерения оцениваются по общему референсному диапазону для людей без диабета. Включено — по более узкому целевому гликемическому диапазону из Standards of Care ADA, и Коуч опирается на этот диапазон в своих замечаниях о глюкозе. Ваши собственные переопределения цели ниже по-прежнему имеют приоритет.", + "disclaimer": "Это выбирает референсный диапазон. Это не диагноз, он никогда не выводится из измерения, и приложение не предпринимает по нему клинических действий. Какие цели применимы к вам — вопрос к вашему врачу.", + "error": "Не удалось сохранить настройку." + }, + "dangerZoneDetail": "Ваш аккаунт и данные для входа сохраняются.", + "deleteAccountCardDetail": "Это нельзя отменить.", + "passkeyStepUpRequired": "Для вашей безопасности войдите снова перед удалением ключа доступа.", + "setup": { + "title": "Настройка", + "description": "Вопросы, которые определяют, что HealthLog показывает первым, и контрольный список начала работы на сводке.", + "setUpAgain": "Настроить заново", + "showChecklist": "Показать контрольный список снова", + "checklistShown": "Контрольный список снова на сводке.", + "checklistNothingHidden": "Контрольный список не был скрыт; он открывается на сводке." + }, + "documentSources": { + "title": "Архивы документов", + "description": "Ищите Paperless-ngx или Papra из HealthLog и импортируйте выбранные документы.", + "explainer": "Кнопка импорта появляется везде, где вы привязываете документы: на визите, вакцинации и состоянии, а также в разделе Документы. HealthLog хранит собственную зашифрованную копию каждого импортированного документа и обращается к вашему архиву только при поиске или импорте.", + "systemLabel": "Архив", + "statusConnected": "Подключено", + "statusNotConnected": "Не подключено", + "connectedSince": "Подключено, последняя проверка {date}", + "originRemoved": "Этого адреса больше нет в списке разрешённых архивов сервера. Спросите администратора или сохраните другой адрес.", + "baseUrl": "Адрес", + "allowedOrigins": "Разрешено на этом сервере: {origins}", + "organizationId": "ID организации", + "organizationHelp": "Часть после /organizations/ в адресной строке Papra. ID организации Papra выглядит как org_, за которым следуют 24 буквы и цифры.", + "token": "Токен API", + "tokenSaved": "Сохранено для этого адреса. Оставьте пустым, чтобы сохранить.", + "tokenHelpPaperless": "В Paperless-ngx: Мой профиль, токен API.", + "tokenHelpPapra": "В Papra: ключ API с разрешениями documents:read и tags:read.", + "save": "Сохранить и проверить", + "saving": "Проверка…", + "saved": "Подключено. Архив ответил.", + "test": "Проверить", + "testOk": "Архив ответил за {latency} мс.", + "disconnect": "Отключить", + "disconnectTitle": "Отключить {name}?", + "disconnectDescription": "HealthLog забывает адрес и токен. Уже импортированные документы остаются в HealthLog.", + "unavailableExplainer": "Этот сервер больше не разрешает архивы документов, поэтому подключение ниже нельзя использовать. Вы всё ещё можете его убрать.", + "moduleOffExplainer": "Документы выключены, поэтому подключение ниже не используется. Вы всё ещё можете его убрать.", + "tokenNewAddress": "Для нового адреса снова нужен токен API." + }, + "emailChangePassword": "Текущий пароль (нужен для смены адреса электронной почты)", + "reproof": { + "description": "Это передаёт или экспортирует ваши данные о здоровье. Подтвердите, что это вы, чтобы продолжить.", + "descriptionChange": "Это меняет то, что должны иметь возможность менять только вы. Подтвердите, что это вы, чтобы продолжить.", + "signInAgain": "Войдите снова, затем попробуйте ещё раз. В вашем аккаунте нет пароля или ключа доступа для подтверждения здесь.", + "failed": "Не сработало. Проверьте введённое и попробуйте снова.", + "oidcDone": "Подтверждено. Следующие пять минут можно действовать без повторного запроса.", + "oidcFailed": "Ваш провайдер удостоверений не смог подтвердить, что это вы. Попробуйте снова." + }, + "passwordTitle": "Пароль", + "tokenNameLabel": "Название токена", + "displayCard": { + "title": "Отображение", + "description": "Язык, единицы и форматы, сохраняются сразу при изменении." + }, + "integrationCard": { + "state": { + "ok": "Работает", + "limited": "Ограничено", + "degraded": "С задержкой", + "actionRequired": "Требуется действие" + }, + "reason": { + "dataArriving": "Данные поступают.", + "dataArrivingHistory": "Данные поступают. Более старая история загружается в фоне.", + "firstSyncPending": "Подключено. Первая синхронизация скоро запустится.", + "planLimited": "Данные поступают. Ваш тариф {provider} не включает {list}.", + "permissionLimited": "Данные поступают. Отсутствует разрешение для {list}.", + "providerErrors": "{provider} не отвечает надёжно с {since}. HealthLog продолжает пытаться; с вашей стороны делать ничего не нужно.", + "providerErrorsNoSince": "{provider} сейчас не отвечает надёжно. HealthLog продолжает пытаться; с вашей стороны делать ничего не нужно.", + "syncStalled": "HealthLog не синхронизировался с {since}. Это на стороне сервера, а не вашего устройства.", + "syncStalledNoSince": "HealthLog сейчас не синхронизируется. Это на стороне сервера, а не вашего устройства.", + "noNewData": "Новых данных нет с {since}.", + "noNewDataNoSince": "Новых данных нет уже некоторое время.", + "noNewDataApple": "Новых данных нет с {since}. Один раз откройте HealthLog на iPhone.", + "noNewDataAppleNoSince": "Новых данных нет уже некоторое время. Один раз откройте HealthLog на iPhone.", + "unexpectedSilence": "Ничего не приходило с {since}, хотя {provider} обычно доставляет ежедневно.", + "unexpectedSilenceNoSince": "Ничего не приходит, хотя {provider} обычно доставляет ежедневно.", + "reauthRequired": "Подключение к {provider} истекло. Переподключитесь, чтобы данные продолжали поступать.", + "pausedAfterErrors": "{provider} приостановлен после сбоев с {since}.", + "pausedAfterErrorsNoSince": "{provider} приостановлен после повторных сбоев." + }, + "when": { + "today": "сегодня, {time}", + "yesterday": "вчера, {time}", + "date": "{date}, {time}" + }, + "items": { + "activity": "активность", + "sleep": "сон" + }, + "moreValuesOne": "ещё {count}", + "moreValuesFew": "ещё {count}", + "moreValuesOther": "ещё {count}", + "notConnected": "Не подключено.", + "lastData": "Последние данные: {when}", + "lastDataNone": "Последние данные: пока нет", + "reconnect": "Переподключить", + "resume": "Возобновить", + "menuLabel": "Дополнительные действия для {provider}", + "menu": { + "credentials": "Изменить учётные данные", + "address": "Изменить адрес и токен" + }, + "syncing": "Синхронизация…", + "details": { + "title": "Сведения для сообщения об ошибке", + "none": "нет", + "state": "Состояние", + "since": "с", + "lastSync": "Последняя синхронизация", + "lastData": "Последние данные", + "failingParts": "сбойные части", + "recentCalls": "Недавние вызовы", + "unavailable": "Недоступно", + "unavailableList": "Недоступно: {list}", + "causePlan": "тариф", + "causePermission": "разрешение", + "failureStreak": "Серия сбоев: {count} из {threshold}", + "copyFailed": "Не удалось скопировать. Выделите текст и скопируйте вручную." + }, + "historyEnds": { + "horizon": "{type}: импортировано до {date}. Более старые измерения лежат за пределом импорта.", + "noProgress": "{type}: импортировано до {date}. Google перестал возвращать более старые измерения, поэтому импорт заканчивается там." + } + }, + "dawarich": "Dawarich", + "dawarichTag": "Перемещения", + "dawarichDescription": "Подключите свой экземпляр Dawarich, чтобы получать дневное расстояние, время вне дома и дни путешествий.", + "dawarichUrl": "Адрес Dawarich", + "dawarichApiKey": "API-ключ", + "dawarichApiKeyHelp": "Вы найдёте его в Dawarich в разделе «Аккаунт». HealthLog использует его только для чтения дневных значений, никогда координат или названий мест.", + "dawarichConnect": "Подключить", + "dawarichUpdate": "Сохранить изменения", + "dawarichConnected": "Dawarich подключён. Последние 30 дней загружаются.", + "dawarichSync": "Загрузить сейчас", + "dawarichSyncQueued": "Последние семь дней скоро будут загружены.", + "dawarichSyncAlreadyQueued": "Загрузка уже в пути.", + "dawarichDisconnect": "Отключить", + "dawarichDisconnectTitle": "Отключить Dawarich?", + "dawarichDisconnectDescription": "Будущие загрузки прекратятся. Уже сохранённые дни останутся.", + "dawarichDisconnectDelete": "Отключить и удалить дни", + "dawarichDisconnectDeleteTitle": "Отключить и удалить каждый день?", + "dawarichDisconnectDeleteDescription": "Подключение и каждый сохранённый день перемещений удаляются. Это нельзя отменить.", + "dawarichHomePlaceSet": "Дом задан.", + "dawarichHomePlaceMissing": "Задайте свой дом, чтобы можно было измерять время вне дома.", + "dawarichHomeCountryIs": "Страна проживания: {country}.", + "dawarichHomeCountryMissing": "Страна проживания ещё не задана, поэтому нет дней путешествий.", + "dawarichDaysStored": "Сохранено дней: {count}", + "dawarichHomePlace": "Дом", + "dawarichHomePlaceChoose": "Выберите место из Dawarich", + "dawarichHomePlaceChange": "Выбрать дом", + "dawarichHomeCountry": "Страна проживания", + "dawarichHomeCountryHelp": "Двухбуквенный код страны, например DE. Если оставить пустым, учитывается страна, в которой вы провели больше всего дней за последний год.", + "dawarichHomeSave": "Сохранить", + "dawarichHomeSaved": "Сохранено.", + "dawarichErrors": { + "invalid": "Этот адрес не работает. Используйте адрес экземпляра без учётных данных.", + "privateOrigin": "Этот экземпляр находится в частной сети. Попросите оператора сервера одобрить его.", + "credentials": "Dawarich не принял ключ API.", + "unreachable": "Dawarich недоступен. Проверьте адрес и что экземпляр запущен.", + "rateLimited": "Слишком много попыток. Подождите немного и попробуйте снова.", + "homePlaceUnknown": "Экземпляр Dawarich больше не знает это место.", + "notConnected": "Dawarich не подключён.", + "generic": "Не сработало. Попробуйте снова." + }, + "fitbitRetirement": { + "ending": "Google отключает Fitbit Web API {date}. С этого момента это подключение перестанет синхронизироваться.", + "ended": "Google отключил Fitbit Web API {date}. Это подключение больше не синхронизируется.", + "move": "Google Health читает те же устройства Fitbit и Pixel. Подключите его ниже, чтобы данные продолжали поступать. Google запросит ваше согласие ещё раз, потому что подключение Fitbit нельзя перенести. Всё уже импортированное остаётся.", + "toCard": "Перейти к Google Health", + "guide": "Как подключить Google Health", + "badgeEnding": "Отключается", + "badgeEnded": "Выведено из эксплуатации" + }, + "passkeyAddedToast": "Ключ доступа добавлен.", + "passkeyRemovedToast": "Ключ доступа убран.", + "integrationDisconnected": "{provider} отключён.", + "integrationDisconnectFailed": "Не удалось отключить {provider}.", + "timezoneSaved": "Часовой пояс сохранён.", + "moduleState": { + "on": "Вкл.", + "off": "Выкл.", + "change": "Изменить в Модулях" + }, + "timezoneUseDevice": "Использовать часовой пояс этого устройства ({zone})", + "dangerZoneConfirmDescriptionGrace": "Это удаляет всё в вашей записи: измерения, лекарства, записи настроения, результаты анализов, записи цикла, документы, диалоги с ИИ и все подключения интеграций, а также всё, что из них получено, и всё, что вы удалили ранее. Ссылки для врача, которыми вы поделились, сразу перестанут работать. Ваш аккаунт сохранится вместе с данными для входа и настройками отображения, такими как язык, часовой пояс и единицы. Копия вашей записи хранится {days} дней, чтобы администратор этого сервера мог её восстановить до тех пор. После этого удаление окончательно.", + "deleteAccountCardDetailGrace": "Ваш аккаунт сразу блокируется и стирается через {days} дней. До этого администратор этого сервера может отменить удаление.", + "deleteAccountConfirmDescriptionGrace": "Вы выходите из аккаунта, и он сразу блокируется. Через {days} дней он стирается навсегда вместе со всеми данными о здоровье, ключами доступа, сеансами и записями аудита. До этого администратор этого сервера может отменить удаление. Копии в резервных копиях этого сервера истекают по истечении срока хранения.", + "deleteAccountScheduled": "Ваш аккаунт заблокирован и будет стёрт {date}. Выполняется выход.", + "dangerZoneSuccessGrace": "Ваша история здоровья удалена. Администратор этого сервера может восстановить её до {date}.", + "dangerZoneRestoreLimits": "Доступ тоже завершается: то, чем вы делитесь с другими, то, чем они делятся с вами, и любая роль опекуна. Восстановление возвращает запись в том виде, в каком она сейчас. Всё, что добавлено после удаления, заменяется, а подключения интеграций, общий доступ, роли опекуна и ссылки общего доступа не возвращаются; их нужно настраивать заново." + }, + "admin": { + "title": "Администрирование", + "subtitle": "Состояние системы, пользователи и настройки", + "settingsSaveError": "Не удалось сохранить настройки", + "systemStatus": "Состояние системы", + "systemStatusDescription": "Состояние работы этого экземпляра: база данных, воркер и количество записей.", + "database": "База данных", + "databaseConnected": "Подключено", + "databaseError": "Ошибка", + "startedAt": "Запущено", + "users": "Пользователи", + "measurementsCount": "Измерения", + "activeTokens": "Активные токены API", + "activeSessions": "Активные сеансы", + "loadingStatus": "Загрузка состояния…", + "systemStatusLoadError": "Не удалось загрузить состояние системы.", + "systemStatusRetry": "Повторить", + "adminSettingsLoadError": "Не удалось загрузить настройки администратора. Переключатели ниже могут не отражать текущее состояние. Обновите страницу.", + "hostMetrics": { + "title": "Нагрузка хоста", + "load1": "Нагрузка (1 мин)", + "memUsedPercent": "Память", + "diskBusyPercent": "Дисковый ввод-вывод", + "last2hours": "Последние 2 часа", + "empty": "Сбор данных начат. Данные появятся через 1–2 минуты.", + "loadError": "Не удалось загрузить метрики хоста. Попробуйте обновить страницу." + }, + "aiServerKey": { + "title": "Серверный ключ ИИ", + "description": "Ключ оператора для аккаунтов, которые не настроили свой собственный.", + "byokHint": "Собственный ключ пользователя (BYOK, вход через ChatGPT или локальный провайдер) всегда имеет приоритет; серверный ключ — последняя ступень в цепочке провайдеров.", + "consentHint": "Запросы через серверный ключ требуют действующего согласия пользователя на ИИ; без подтверждения согласия ничего не отправляется.", + "baseUrlHint": "Базовый URL выбирает API: URL Anthropic, например https://api.anthropic.com/v1, распознаётся, любой другой хост вызывается по API, совместимому с OpenAI.", + "statusConfigured": "Настроено", + "statusNotConfigured": "Не настроено", + "keyLabel": "API-ключ", + "keyPlaceholder": "sk-...", + "keyPlaceholderSet": "Сохранён ({preview}). Введите новый ключ, чтобы заменить", + "modelLabel": "Модель", + "baseUrlLabel": "Базовый URL", + "save": "Сохранить", + "remove": "Убрать ключ", + "removeTitle": "Убрать серверный ключ?", + "removeBody": "Аккаунты без собственного ключа сразу теряют функции ИИ. Ключ нигде не показывается после сохранения, поэтому для возврата понадобится оригинал.", + "removeConfirm": "Убрать ключ", + "saved": "Настройки серверного ключа ИИ сохранены", + "error": "Не удалось сохранить серверный ключ ИИ", + "legacyGrantTitle": "ALLOW_LOCAL_AI_PRIVATE_HOSTS=true устарел", + "legacyGrantBody": "Он всё ещё позволяет серверному ключу выше и настройкам ИИ, сохранённым в аккаунте администратора, обращаться к вашей сети, и будет удалён в следующем выпуске. Другим аккаунтам нужно, чтобы их эндпоинт ИИ уже был указан в AI_PRIVATE_ORIGINS. Задайте AI_PRIVATE_ORIGINS в окружении сервера, перезапустите, затем удалите ALLOW_LOCAL_AI_PRIVATE_HOSTS.", + "legacyGrantOrigins": "Базовые URL ИИ, сохранённые на этом экземпляре, которые указывают на вашу сеть:", + "legacyGrantNoOrigins": "Ни один базовый URL ИИ, сохранённый на этом экземпляре, не указывает на вашу сеть, поэтому ALLOW_LOCAL_AI_PRIVATE_HOSTS можно удалить сейчас." + }, + "providerHealth": { + "title": "Состояние провайдеров ИИ", + "description": "Состояние доставки каждого провайдера ИИ, сведённое из журнала повторов по пользователям.", + "loading": "Загрузка состояния провайдеров…", + "loadError": "Не удалось загрузить состояние провайдеров.", + "empty": "Вызовы ИИ ещё не записаны.", + "trackedUsers": "Отслеживается пользователей: {count}", + "lastOk": "последний успех {at}", + "lastFailure": "последний сбой {at}", + "lastFailureStatus": "HTTP {status}", + "statusHealthy": "Исправен", + "statusFailing": "{failing} из {tracked} сбоят, {run} подряд", + "typeAdminOpenai": "Серверный ключ (оператор)", + "typeAdminCodex": "Центральный ChatGPT (оператор)", + "typeOpenai": "Ключ OpenAI (личный)", + "typeAnthropic": "Ключ Anthropic (личный)", + "typeCodex": "Вход через ChatGPT (личный)", + "typeLocal": "Локальная модель (личная)", + "typeGateway": "Шлюз, совместимый с OpenAI (личный)", + "spendToday": "Сегодня, по календарному дню каждого аккаунта: {total} токенов, из них {operator} на собственном ключе оператора (аккаунтов с расходом: {accounts}).", + "statusPaused": "Приостановлен", + "pausedHint": "Приостановлен после повторных сбоев для {count} пользователей до {at}. Затем он будет опробован снова автоматически.", + "modelNotServed": "Эндпоинт больше не предлагает модель {model}. Выберите модель, которую он перечисляет, в настройках ИИ.", + "usageLevels": "Аккаунты по уровню использования ИИ: {frugal} экономный, {standard} стандартный, {full} полный." + }, + "aiQuality": { + "title": "Качество аналитики", + "loading": "Загрузка сводки отзывов…", + "loadError": "Не удалось загрузить сводку качества аналитики. Попробуйте обновить страницу.", + "empty": "Отзывов пока нет. Агрегатор запускается ежедневно в 04:00. Как только пользователи начнут оценивать рекомендации, здесь появятся диапазоны доли полезных.", + "windowLabel": "Последние {days} дней", + "generatedAtLabel": "Сформировано", + "colSeverity": "Тяжесть", + "colMetric": "Показатель", + "colProvider": "Провайдер", + "colPromptVersion": "Промпт", + "colHelpful": "Полезно", + "colNotHelpful": "Не полезно", + "colHelpfulRate": "Доля полезных" + }, + "coachFeedback": { + "title": "Отзывы о Коуче", + "loading": "Загрузка сводки отзывов о Коуче…", + "loadError": "Не удалось загрузить сводку отзывов о Коуче. Попробуйте обновить страницу.", + "empty": "Отзывов о Коуче пока нет. Агрегатор запускается ежедневно в 04:00. Как только пользователи начнут оценивать ответы Коуча, здесь появятся диапазоны доли полезных.", + "windowLabel": "Последние {days} дней", + "generatedAtLabel": "Сформировано", + "colPromptVersion": "Версия промпта", + "colTone": "Тон", + "colVerbosity": "Подробность", + "colHelpful": "Полезно", + "colNotHelpful": "Не полезно", + "colN": "n", + "colHelpfulRate": "Доля полезных" + }, + "workerStatus": "Воркер задач", + "workerRunning": "Работает", + "workerStopped": "Остановлен", + "lastReminderCheck": "Последняя проверка напоминаний", + "appSettings": "Настройки приложения", + "appSettingsDescription": "Глобальные значения по умолчанию для регистрации, языка и часового пояса новых аккаунтов.", + "registrationEnabled": "Разрешить регистрацию", + "registrationEnabledDescription": "Если выключено, новые пользователи не могут зарегистрироваться.", + "registrationOpenHint": "Регистрация открыта: любой, кто может достучаться до этого экземпляра, может создать аккаунт. Закройте её здесь, когда у всех, кому нужен аккаунт, он появится.", + "defaultLanguage": "Язык по умолчанию", + "defaultLanguageDescription": "Используется для новых пользователей и как запасной вариант.", + "defaultUserTimezone": "Часовой пояс по умолчанию для новых аккаунтов", + "defaultUserTimezoneDescription": "Используется для новых аккаунтов без определённого браузером пояса; существующие аккаунты сохраняют свой.", + "defaultUserTimezoneFallback": "Europe/Berlin (по умолчанию)", + "servicesGlobal": "Каналы и API", + "servicesGlobalDescription": "Выключенные сервисы недоступны ни одному пользователю.", + "telegramGlobal": "Разрешить уведомления Telegram.", + "ntfyGlobal": "Разрешить уведомления ntfy.", + "webPushGlobal": "Разрешить push-уведомления браузера.", + "integrationWebPush": "Web Push", + "offlineGeoLabel": "Геоданные", + "offlineGeoEnabled": "Офлайн (GeoLite2)", + "offlineGeoFallback": "Онлайн ({host}). Смонтируйте базы GeoLite2 и задайте GEOLITE2_DIR", + "heapLimitLabel": "Лимит кучи", + "heapLimitValue": "{mb} МБ", + "heapLimitLow": "{mb} МБ, мало. Задайте APP_MEMORY_LIMIT=1536m в .env", + "memoryBelowFloor": "Контейнер {mb} МБ, ниже поддерживаемого минимума {floor} МБ. Задайте APP_MEMORY_LIMIT={floor}m в .env", + "offlineGeoOff": "Выкл.", + "offlineGeoChosen": "Онлайн ({host})", + "apiGlobal": "Разрешить эндпоинты API и токены API.", + "umamiTitle": "Umami", + "umamiDescription": "Веб-аналитика с Umami.", + "glitchtipTitle": "GlitchTip", + "glitchtipDescription": "Отслеживание ошибок с GlitchTip.", + "webPushVapidTitle": "Web Push VAPID", + "umamiEnabled": "Включить отслеживание Umami", + "umamiScriptUrl": "URL скрипта Umami", + "umamiScriptUrlPlaceholder": "https://analytics.example.com/script.js", + "umamiWebsiteId": "ID сайта Umami", + "umamiWebsiteIdPlaceholder": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", + "glitchtipEnabled": "Включить отслеживание ошибок GlitchTip", + "glitchtipDsn": "DSN GlitchTip", + "glitchtipDsnPlaceholder": "https://@glitchtip.example.com/", + "glitchtipEnvironment": "Окружение GlitchTip", + "glitchtipEnvironmentPlaceholder": "production", + "glitchtipTargetOn": "Отчёты об ошибках идут на {host}.", + "glitchtipTargetOff": "Отчёты об ошибках остаются на этом хосте. Никуда ничего не отправляется.", + "glitchtipTargetNoTarget": "Отслеживание ошибок включено, но цель не задана, поэтому ничего не отправляется.", + "glitchtipUnproven": "Не подтверждено", + "glitchtipDeliveryUnproven": "Цель задана, но ни один отчёт ещё не покинул этот хост. Нажмите «Проверить», чтобы узнать, принимает ли она его.", + "glitchtipDeliveryStale": "За последние {hours} ч ни один отчёт не покинул этот хост. Нажмите «Проверить», чтобы убедиться, что цель по-прежнему принимает отчёт.", + "glitchtipDeliveryFailed": "Последний отчёт не прошёл ({reason}).", + "webPushVapidDescription": "Настройте здесь ключи VAPID и subject, чтобы push-уведомления браузера работали без переменных окружения.", + "webPushVapidPublicKey": "Публичный ключ VAPID", + "webPushVapidPublicKeyPlaceholder": "BElx... (Base64URL)", + "webPushVapidPrivateKey": "Приватный ключ VAPID", + "webPushVapidPrivateKeyPlaceholder": "Необязательно: введите новый приватный ключ", + "webPushVapidSubject": "Subject VAPID", + "webPushVapidSubjectPlaceholder": "mailto:you@example.com", + "webPushVapidGenerate": "Сгенерировать ключи", + "webPushVapidGenerating": "Генерация…", + "webPushVapidGenerated": "Ключи VAPID сгенерированы. Сохраните subject, чтобы завершить.", + "webPushVapidGenerateFailed": "Не удалось сгенерировать ключи VAPID.", + "webPushVapidGenerateConfirm": "Ключи VAPID уже настроены. Генерация новой пары делает недействительной каждую подписку на push-уведомления браузера, и каждому устройству придётся подписаться заново. Продолжить?", + "webPushVapidGenerateConfirmTitle": "Сгенерировать ключи VAPID заново?", + "webPushVapidRegenerate": "Сгенерировать заново", + "configured": "Настроено", + "monitoringTestSuccess": "Тестовое событие отправлено", + "monitoringTestFailed": "Тест мониторинга не удался", + "assistant": { + "title": "Ассистент", + "description": "Каждый переключатель останавливает охватываемую им работу ИИ и скрывает её текст, при этом данные и баллы продолжают загружаться.", + "master": { + "title": "Ассистент включён", + "description": "Главный переключатель для всех функций ИИ. Когда выключен, ничего не отправляется модели, и каждый переключатель ниже выключен." + }, + "coach": { + "title": "Тренер", + "description": "Чат, поддержание памяти Коуча и подсказки ИИ. Сохранённые диалоги остаются доступными для чтения и удаления." + }, + "briefing": { + "title": "Ежедневная сводка", + "description": "Ежедневная сводка, её вступительные строки в других местах приложения и сводки за период, написанные моделью." + }, + "insightStatus": { + "title": "Заметки о состоянии", + "description": "Короткие заметки, которые модель пишет по каждому измерению и показателю, заметки о тренировках и строки реакций. Наибольшая доля использования токенов." + }, + "documentAi": { + "title": "Чтение документов", + "description": "Чтение сохранённых документов с помощью ИИ, сканов результатов анализов и извлечение лекарств из текста. Наибольшая доля данных, покидающих сервер." + }, + "reasoning": { + "enabled": "Разрешить более глубокое мышление", + "max": "Наибольшая глубина мышления", + "description": "Модели думают перед ответом: Коуч, ежедневная сводка и сводки за период. Точнее, использует больше токенов." + } + }, + "modules": { + "title": "Доступность модулей", + "description": "Выключить модуль для всего сервера.", + "saveError": "Не удалось обновить доступность модулей.", + "detail": "Вес, АД и пульс — основные измерения и всегда остаются включёнными.", + "coachFollowsSwitch": "Следует за переключателем Коуча в разделе Коуч." + }, + "invites": { + "title": "Ссылки-приглашения", + "description": "Каждая ссылка допускает регистрацию, даже когда регистрация закрыта.", + "create": "Создать приглашение", + "createTitle": "Создать приглашение", + "createDescription": "Ссылка допускает регистрацию, даже когда регистрация закрыта.", + "ttlLegend": "Действует", + "createDays": "Дней: {days}", + "maxUsesLabel": "Максимум использований", + "maxUsesHint": "Сколько регистраций допускает эта ссылка (1–50).", + "createConfirm": "Создать приглашение", + "createdToast": "Приглашение создано", + "createError": "Не удалось создать приглашение.", + "tokenTitle": "Ссылка-приглашение", + "tokenOnceHint": "Копируется только сейчас. Скопируйте ссылку или дайте отсканировать QR-код.", + "hashExplainer": "Хранится только хеш ссылки, поэтому позже её нельзя показать снова. Если она потеряется, отзовите приглашение и создайте новое.", + "copyLink": "Копировать ссылку", + "copiedToast": "Ссылка скопирована", + "copyError": "Не удалось скопировать.", + "qrAlt": "QR-код для ссылки-приглашения", + "loadError": "Не удалось загрузить приглашения.", + "emptyTitle": "Приглашений пока нет", + "emptyDescription": "Создайте ссылку-приглашение, чтобы допустить кого-то, пока регистрация закрыта.", + "colStatus": "Статус", + "colCreated": "Создано", + "colExpires": "Истекает", + "colUses": "Использования", + "colRedeemedBy": "Активировано", + "colActions": "Действия", + "byCreator": "от {by}", + "expiresInDaysOne": "через 1 день", + "expiresInDaysOther": "через {count} дней", + "statusActive": "Активно", + "statusExpired": "Истекло", + "statusExhausted": "Израсходовано", + "statusRevoked": "Отозвано", + "redeemerDeleted": "удалённый аккаунт", + "redeemedByMore": "{username} + ещё {count}", + "redemptionsTitle": "Активаций: {count}", + "revoke": "Отозвать", + "revokeAria": "Отозвать приглашение", + "revokeConfirmTitle": "Отозвать это приглашение?", + "revokeConfirmBody": "Ссылка-приглашение сразу становится недействительной. Аккаунты, уже зарегистрированные по ней, остаются, а история активаций остаётся видимой.", + "revokeConfirmAction": "Отозвать", + "cancel": "Отмена", + "revokedToast": "Приглашение отозвано.", + "revokeError": "Не удалось отозвать приглашение." + }, + "userManagement": "Аккаунты", + "userManagementDescription": "Роли, сброс паролей и принудительный выход для каждого аккаунта.", + "userName": "Имя", + "userEmail": "Электронная почта", + "userRole": "Роль", + "userPasskeys": "Ключи доступа", + "userCreated": "Создан", + "userActions": "Действия", + "editUser": "Изменить пользователя", + "editUserTitle": "Изменить пользователя: {name}", + "demoteToUser": "Понизить до пользователя", + "promoteToAdmin": "Повысить до администратора", + "toUser": "Сделать пользователем", + "toAdmin": "Сделать администратором", + "ownRoleUnchangeable": "Нельзя изменить собственную роль", + "resetPassword": "Сбросить пароль", + "resetPasswordTitle": "Сбросить пароль: {name}", + "newPassword": "Новый пароль", + "newPasswordPlaceholder": "Не менее 12 символов", + "passwordReset": "Пароль сброшен", + "reset": "Сбросить", + "loadingUsers": "Загрузка пользователей…", + "apiTokens": "Токены API", + "apiTokensDescription": "Все активные и отозванные токены API по всем аккаунтам.", + "tokenUser": "Пользователь", + "tokenName": "Название", + "tokenPermissions": "Права", + "tokenPermissionAll": "Все", + "tokenPermissionAllTooltip": "Право с подстановочным знаком: этот токен может вызывать любой маршрут API.", + "tokenStatus": "Статус", + "tokenLastUsed": "Последнее использование", + "tokenCreated": "Создан", + "tokenNeverUsed": "Никогда", + "tokensEmptyTitle": "Токенов API пока нет", + "tokensEmptyDescription": "Токены выдаются при входе нативного клиента или через Настройки → Аккаунт.", + "loginOverviewDescription": "События входа и аутентификации по всем аккаунтам с фильтрацией и экспортом в CSV.", + "loginOverviewFilterLabel": "Фильтр событий", + "allAuthEvents": "Все события аутентификации", + "failedOnly": "Только неудачные", + "loginEmptyDescription": "Здесь появятся входы, выходы и изменения ключей доступа.", + "loginEmptyFailedTitle": "Неудачных попыток входа нет", + "loginEmptyFailedDescription": "Это безопасное состояние. Переключитесь на все события, чтобы увидеть успешные входы.", + "loginEmptyResetFilter": "Показать все события", + "showingEntries": "Показаны {count} из {total} записей аутентификации", + "status": "Статус", + "action": "Действие", + "ip": "IP", + "location": "Местоположение", + "timestamp": "Время", + "provider": "Провайдер", + "providerPassword": "Пароль", + "providerPasskey": "Ключ доступа", + "providerApiToken": "Токен API", + "providerWithings": "Withings", + "providerUnknown": "Неизвестно", + "outcome": "Исход", + "outcomeSuccess": "Успех", + "outcomeFailed": "Неудача", + "auditDetails": "Подробности", + "deleteAllData": "Удалить все данные глобально", + "deleteAllDescription": "Удаляет все записи всех аккаунтов; аккаунты и их учётные данные для входа сохраняются.", + "deleteAllConfirm": "Действительно удалить все данные?", + "deleteAllConfirmDescription": "Это безвозвратно удаляет записи всех аккаунтов во всей базе данных, а не выбранные таблицы. Сохраняются: аккаунты пользователей и учётные данные для входа, конфигурация экземпляра и делегированные права, которые оставляют управляемые профили доступными. Квитанция об этом удалении будет записана в журнал аудита после него; история аудита до него уходит вместе со всем остальным.", + "deleteButton": "Удалить все данные", + "deleteAllPromptLabel": "Введите {token}, чтобы продолжить", + "finalDelete": "Удалить безвозвратно", + "deletedResult": "Удалено {rows} строк в {tables} таблицах. Аккаунты пользователей и учётные данные для входа сохранены.", + "authRegister": "Регистрация", + "authClaim": "Профиль перехвачен", + "authLogin": "Вход", + "authLoginPasskey": "Вход по ключу доступа", + "authLoginPassword": "Вход по паролю", + "authLoginFailed": "Неудача", + "authLogout": "Выход", + "authPasskeyRegister": "Ключ доступа добавлен", + "authPasskeyDelete": "Ключ доступа удалён", + "authTokenAutoissueNative": "Выдан токен нативного клиента", + "authTokenRefresh": "Токен обновлён", + "authTokenRevoke": "Токен отозван", + "medicationReminders": "Напоминания о лекарствах", + "medicationRemindersDescription": "Пороги смены цвета значка напоминания на карточках лекарств.", + "notificationHealth": { + "title": "Состояние уведомлений", + "description": "Результаты доставки по всем пользователям за последние 24 часа.", + "empty": "За это окно уведомления не отправлялись.", + "ok": "OK", + "error": "Неудача", + "skipped": "Пропущено", + "autoDisabled": "Автоматически выключенные каналы" + }, + "reminderLateMinutes": "Порог опоздания (минуты)", + "reminderLateMinutesDescription": "Минуты после окончания окна до смены значка с жёлтого на оранжевый.", + "reminderMissedMinutes": "Порог пропуска (минуты)", + "reminderMissedMinutesDescription": "Минуты после окончания окна до того, как приём считается пропущенным.", + "notificationTestSend": "Отправить тест", + "notificationTestSuccess": "Тестовое уведомление отправлено", + "notificationTestFailed": "Не удалось отправить тестовое уведомление", + "reminderCheckRun": "Запустить проверку напоминаний", + "reminderCheckSuccess": "Проверка напоминаний завершена", + "reminderCheckFailed": "Не удалось запустить проверку напоминаний", + "reminderCheckResults": "Результаты", + "reminderCheckNotifOn": "Уведомления включены", + "reminderCheckNotifOff": "Уведомления выключены", + "reminderCheckEventsToday": "События сегодня", + "reminderCheckNotifSent": "Отправлено", + "shell": { + "overview": "Обзор", + "sectionsNav": "Разделы админки" + }, + "overview": { + "snapshotTitle": "Снимок системы", + "snapshotDatabase": "База данных", + "snapshotWorker": "Воркер", + "snapshotStarted": "Запущен", + "snapshotOfflineGeo": "Геоданные", + "snapshotOfflineGeoOn": "Офлайн (GeoLite2)", + "snapshotOfflineGeoOff": "Онлайн ({host})", + "versionTileTitle": "Версия", + "versionTileVersion": "Текущая версия", + "versionTileBuildSha": "SHA сборки", + "versionTileBuiltAt": "Собрано", + "versionTileUpdateAvailable": "Доступно обновление: {tag}", + "versionTileUpToDate": "Актуально", + "versionTileCheckOff": "Проверка обновлений выключена", + "snapshotLoadError": "Не удалось загрузить снимок системы.", + "snapshotLoading": "Загрузка снимка…", + "auditTitle": "Недавняя активность", + "auditEmpty": "Недавних записей аудита нет.", + "auditLoadError": "Не удалось загрузить недавнюю активность.", + "auditLoading": "Загрузка активности…", + "auditViewAll": "Показать все" + }, + "section": { + "system-status": { + "title": "Состояние системы", + "subtitle": "Воркер, база данных и состояние интеграций с первого взгляда." + }, + "general": { + "title": "Общие", + "subtitle": "Регистрация, язык по умолчанию и другие переключатели приложения." + }, + "services": { + "title": "Сервисы", + "subtitle": "Включите или выключите каналы уведомлений и API для всего сервера." + }, + "integrations": { + "title": "Интеграции", + "subtitle": "Настройте Umami, GlitchTip, Web Push и отчёты об ошибках." + }, + "coach": { + "title": "Тренер", + "subtitle": "Поверхности ассистента, серверный ключ и качество обратной связи в одном месте." + }, + "reminders": { + "title": "Напоминания", + "subtitle": "Настройте пороги напоминаний о лекарствах и запустите ручную проверку." + }, + "users": { + "title": "Пользователи", + "subtitle": "Управляйте аккаунтами пользователей, ролями и активными сеансами.", + "filter": { + "all": "Все", + "admin": "Администраторы", + "user": "Пользователи" + }, + "filterLabel": "Фильтр пользователей", + "forceLogout": "Принудительный выход", + "forceLogoutConfirmTitle": "Принудительно выйти {name}?", + "forceLogoutConfirmBody": "Все активные сеансы этого пользователя будут отозваны. Ему придётся снова войти на каждом устройстве.", + "forceLogoutSuccess": "{name} вышел из {count} сеансов", + "forceLogoutFailed": "Не удалось выполнить принудительный выход", + "cannotLogoutSelf": "Нельзя принудительно выйти из собственного аккаунта", + "emptyTitle": "В этом представлении нет пользователей", + "emptyDescription": "Нет пользователей, соответствующих текущему фильтру.", + "emptyResetFilter": "Показать всех пользователей", + "deletionPending": "Удаление {date}", + "deletionPendingNoDate": "Ожидает удаления", + "undoDeletion": "Отменить удаление", + "undoDeletionTitle": "Отменить удаление {name}?", + "undoDeletionBody": "{name} запросил удаление этого аккаунта, и он будет стёрт по окончании льготного периода. Отмена сохраняет аккаунт и всё в нём как было. {name} сможет снова войти, но токены API, ссылки общего доступа и доверенные устройства останутся отозванными, и их придётся настроить заново.", + "undoDeletionBodyGuardian": "Опекун удалил управляемый профиль {name}, и он будет стёрт по окончании льготного периода. Отмена сохраняет профиль и всё в нём как было, и его опекуны снова смогут к нему обращаться. Его ссылки общего доступа и токены останутся отозванными, и их придётся настроить заново.", + "undoDeletionDone": "Удаление {name} отменено", + "undoDeletionFailed": "Не удалось отменить удаление", + "undoDeletionBodyAdmin": "Администратор удалил аккаунт {name}, и он будет стёрт по окончании льготного периода. Отмена сохраняет аккаунт и всё в нём как было. {name} сможет снова войти, но токены API, ссылки общего доступа и доверенные устройства останутся отозванными, и их придётся настроить заново.", + "deleteUser": "Удалить аккаунт", + "deleteUserTitle": "Удалить аккаунт {name}?", + "deleteUserBodyGrace": "{name} сразу выходит везде и больше не может войти. Аккаунт и всё в нём будет стёрто {date}. До этого вы можете отменить удаление здесь.", + "deleteUserBodyNow": "{name} и всё в аккаунте стирается сразу. Этот сервер не хранит льготный период, поэтому удаление нельзя отменить.", + "deleteUserConfirm": "Удалить аккаунт", + "deleteUserScheduled": "Аккаунт {name} заблокирован и будет стёрт {date}", + "deleteUserDone": "Аккаунт {name} удалён", + "deleteUserFailed": "Не удалось удалить аккаунт" + }, + "invites": { + "title": "Приглашения", + "subtitle": "Создавайте, отслеживайте и отзывайте ссылки-приглашения для регистрации." + }, + "api-tokens": { + "title": "Токены API", + "subtitle": "Активные bearer-токены, выданные нативным клиентам и интеграциям." + }, + "login-overview": { + "title": "Обзор входов", + "subtitle": "Журнал аудита событий аутентификации и администрирования." + }, + "auditLog": { + "filterActor": "Субъект (id пользователя или имя пользователя)", + "filterAction": "Действие", + "filterActionAll": "Все действия", + "filterTarget": "Цель (id или путь)", + "filterDate": "Диапазон дат", + "range24h": "Последние 24 часа", + "range7d": "Последние 7 дней", + "range30d": "Последние 30 дней", + "rangeAll": "За всё время", + "perPage": "На странице", + "prev": "Предыдущая", + "next": "Следующая", + "pageOf": "Страница {page} из {total}", + "export": "Экспорт CSV", + "empty": "Нет записей аудита, соответствующих текущим фильтрам." + }, + "app-logs": { + "title": "Журналы приложения", + "subtitle": "Просмотр последних структурированных широких событий, созданных этим процессом.", + "processNote": "Показаны только журналы процесса приложения; журналы процесса воркера отправляются в Loki, если эта интеграция настроена.", + "filterTraceId": "ID трассировки", + "filterAction": "Действие содержит…", + "filterLevel": "Уровень", + "levelAll": "Все уровни", + "filterRange": "Временное окно", + "range15m": "Последние 15 минут", + "range1h": "Последний час", + "range6h": "Последние 6 часов", + "rangeAll": "Весь буфер", + "colLevel": "Уровень", + "colTimestamp": "Метка времени", + "colAction": "Действие", + "colDuration": "Длительность", + "colTraceId": "Трассировка", + "viewDetails": "Показать подробности для {action} в {timestamp}", + "showing": "Показаны {count} из до {bufferMax} буферизованных событий", + "empty": "Буфер пуст", + "emptyDescription": "Пока нет событий, соответствующих текущим фильтрам. Нажмите «Обновить» после создания трафика.", + "refresh": "Обновить", + "eventDetails": "Подробности события", + "closeDetails": "Закрыть подробности", + "processDetail": "Буфер энергозависим и ограничен 500 записями.", + "cardTitle": "Недавние события", + "filterErrorId": "ID ошибки" + }, + "backups": { + "title": "Резервные копии", + "subtitle": "Копии аккаунтов, хранящиеся в базе данных этого сервера, для отката одного аккаунта на этом сервере.", + "description": "У каждого аккаунта есть одна недельная копия, заменяемая каждое воскресенье, плюс любая копия, загруженная здесь, и копия, снятая перед «Удалить все данные». Копия возвращает один существующий аккаунт на этом сервере. Она не может восстановить потерянный сервер: для этого нужен дамп базы данных и ключи шифрования. Размеры показывают зашифрованную копию. Скачивание расшифровывает её для запросившего администратора; шифротекст остаётся в базе данных.", + "runNow": "Создать резервную копию", + "runEnqueued": "Задание резервного копирования поставлено в очередь", + "runFailed": "Не удалось поставить резервное копирование в очередь", + "loading": "Загрузка резервных копий…", + "loadError": "Не удалось загрузить резервные копии.", + "emptyTitle": "Резервных копий пока нет", + "emptyDescription": "Резервное копирование выполняется автоматически каждое воскресенье в 03:00, или запустите его сейчас, чтобы создать первый снимок.", + "colUser": "Пользователь", + "colType": "Тип", + "typeWeeklyAuto": "Недельный откат аккаунта", + "typeManual": "Вручную", + "colSize": "Размер", + "colCreatedAt": "Последний снимок", + "colActions": "Действия", + "scheduleStaleTitle": "Недельное резервное копирование остановилось", + "scheduleStaleDescription": "Самая новая запланированная копия имеет возраст {days} дней. Работающий недельный запуск никогда не оставляет копию старше {threshold} дней.", + "scheduleFailedTitle": "Последний запланированный запуск резервного копирования не удался", + "scheduleFailedDescription": "{when}: {reason}", + "scheduleFailedNoReason": "причина не записана", + "scheduleRemedy": "Запустите резервное копирование сейчас и проверьте, что появилась новая строка. Если снова не удастся, журнал воркера укажет аккаунт, на котором он остановился.", + "activity": { + "running": "Выполняется с {when}.", + "interruptedTitle": "Запуск остановился на полпути и не вернулся", + "interruptedAccount": "{username}: начат {when}, не завершён", + "interruptedRemedy": "Скорее всего, приложение перезапустилось или закончилась память при записи этой копии. Следующий запуск берёт эти аккаунты последними, поэтому каждый другой аккаунт получает свою копию первым. Если это повторяется, дайте контейнеру больше памяти." + }, + "download": "Скачать", + "downloadAria": "Скачать резервную копию для {username}", + "downloadFailed": "Скачивание не удалось", + "downloadStarted": "Скачивание начато", + "uploadTitle": "Загрузить резервную копию", + "uploadDescription": "Проверьте копию аккаунта и сохраните её рядом с копиями этого сервера. Копия, чей аккаунт больше не на этом сервере, может попасть в другой аккаунт. Восстановление — отдельный шаг.", + "uploadButton": "Загрузить файл", + "uploadHelp": "Резервная копия HealthLog в формате .json или .json.gz. Файл сжимается перед загрузкой; в сжатом виде он может быть до 512 МБ.", + "uploadSuccess": "Резервная копия загружена ({count} записей)", + "uploadFailed": "Загрузка не удалась", + "restore": "Восстановить", + "restoreAria": "Восстановить из резервной копии для {username}", + "restoreTitle": "Восстановить из резервной копии", + "restoreDescription": "Это заменит ВСЕ текущие данные для {username} снимком от {when}. Существующие измерения, лекарства, события приёма, записи настроения, каналы уведомлений, push-подписки и поставленные в очередь удаления Telegram будут удалены.", + "restoreInstanceSettingsLabel": "Также восстановить настройки экземпляра", + "restoreInstanceSettingsHint": "Регистрация, требование MFA, локаль по умолчанию, доступность модулей, конфигурация уведомлений и ИИ, взятые из снимка и применённые ко всем на этой установке. Оставьте пустым, чтобы восстановить только этот аккаунт.", + "restorePromptLabel": "Введите RESTORE, чтобы продолжить", + "previewTitle": "Что содержит эта резервная копия", + "previewLoading": "Чтение содержимого…", + "previewUnavailable": "Не удалось прочитать содержимое. Восстановление всё ещё возможно.", + "previewStillReading": "Эта резервная копия создана более ранней версией, поэтому её содержимое читается полностью, что для большой записи занимает время. Откройте этот диалог снова через несколько минут, чтобы увидеть его. Восстановление от этого не зависит.", + "previewEmpty": "Файл не содержит записей.", + "previewOther": "Другие записи", + "previewMeasurements": "Измерения", + "previewMedications": "Лекарства и приёмы", + "previewMood": "Записи настроения", + "previewLabs": "Результаты анализов", + "previewDocuments": "Документы", + "previewWorkouts": "Тренировки", + "previewCycles": "Данные цикла", + "previewVisits": "Визиты к врачу", + "previewVaccinations": "Вакцинации", + "previewReminders": "Напоминания о профилактике", + "previewCustomMetrics": "Свои показатели", + "previewHealthScores": "История баллов", + "restoreConfirm": "Восстановить сейчас", + "restoreInProgress": "Восстановление…", + "restoreSuccess": "Восстановление завершено", + "restoreFailed": "Восстановление не удалось", + "restoreSkippedToast": "Восстановление завершено, {links} связей симптомов не удалось вернуть", + "restoreSkippedTitle": "{links} связей не восстановлено", + "restoreSkippedDescription": "Файл ссылается на записи, которых эта установка не знает. Всё остальное восстановлено. Тот же список есть в журнале аудита.", + "restoreSkippedLinks": "{count} связей", + "restoreSkippedCycleSymptom": "Симптом цикла", + "restoreSkippedIllnessSymptom": "Симптом заболевания", + "restoreSkippedMoodFactor": "Фактор настроения", + "restoreSkippedMoodTag": "Тег настроения", + "restoreSkippedVisitReference": "Ссылка на визит", + "restoreSkippedVaccinationReference": "Ссылка на вакцинацию", + "restoreSkippedCheckupClosure": "Закрытие осмотра", + "restoreSkippedReminderReference": "Ссылка на напоминание", + "restoreSkippedCoachAttachment": "Ссылка на документ Коуча", + "restoreSkippedCoachReference": "Ссылка Коуча", + "restoreSkippedDocumentConditionLink": "Подшивка документа", + "restoreSkippedRelationLink": "Связь между записями", + "restoreSkippedExtractedFact": "Факт из документа", + "restoreSkippedFactCommitment": "Подтверждение факта", + "docsLink": "Документация", + "restoreSkippedPersonalRecordReference": "Происхождение личного рекорда", + "restoreSkippedEcgReference": "Происхождение ЭКГ-полосы", + "restoreSkippedMedicationTarget": "Целевой показатель лекарства", + "restoreSkippedScheduleRevisionLink": "Преемственность эпох расписания", + "restoreSkippedAccountSetting": "Настройка аккаунта", + "restoreMissingTitle": "Восстановление отклонено: файл неполный", + "restoreMissingDescription": "Собственный манифест файла говорит, что он содержит раздел ниже, а его нет. Ничего не изменено: восстановление заменяет целый класс записей, поэтому возврат раздела, которого нет в файле, опустошил бы его.", + "restoreMissingRemedy": "Используйте одну из копий аккаунта этого сервера или внешнюю копию, либо снова экспортируйте аккаунт и загрузите новый файл. Раздел, который манифест объявляет пропущенным, — это другое, и он восстанавливается нормально.", + "restoreMissingDocuments": "Документы", + "restoreMissingWorkouts": "Тренировки", + "restoreMissingMentalHealth": "Скрининги психического здоровья", + "restoreMissingConsent": "Квитанции согласия", + "offhost": { + "title": "Внешние копии", + "description": "Когда этот хост последний раз помещал зашифрованную копию каждого аккаунта в ваш бакет.", + "loadError": "Не удалось загрузить состояние внешних копий.", + "notConfiguredTitle": "Внешнее резервное копирование не настроено", + "notConfiguredDescription": "Не заданы ни бакет, ни ключ, поэтому ни одна резервная копия не покидает этот хост. Задайте BACKUP_S3_ENDPOINT, BACKUP_S3_BUCKET, BACKUP_S3_ACCESS_KEY, BACKUP_S3_SECRET_KEY и BACKUP_ENCRYPTION_KEY, чтобы включить ночную загрузку.", + "stateFresh": "Свежая", + "stateDue": "Просрочена", + "stateStale": "Устарела", + "stateNever": "Никогда", + "stateUnknown": "Записи пока нет", + "neverDetail": "Для этого аккаунта ничего не поступило. Последняя проверка {when}.", + "unknownDetail": "Ни один ночной запуск ещё не записал этот аккаунт.", + "age": "{hours} ч назад", + "scheduleNote": "Загрузка выполняется каждые {hours} ч. Свежая — в пределах одного запуска, просрочена — один запуск ничего не дал, устарела — два не дали.", + "lifecycleConfigured": "Бакет удаляет копии через {days} дней по собственному правилу жизненного цикла.", + "lifecycleMissing": "У бакета нет правила жизненного цикла, поэтому каждая ночная копия хранится вечно. Добавьте правило, которое истекает объекты через BACKUP_RETENTION_DAYS.", + "lifecycleUnknown": "Удаляет ли бакет старые копии, прочитать не удалось: возможно, учётные данные не могут прочитать его правило жизненного цикла. Проверьте, что правило истекает объекты через BACKUP_RETENTION_DAYS.", + "pendingDeletions": "Копии {count} удалённых или стёртых аккаунтов всё ещё в бакете и удаляются.", + "pendingDeletionsFailing": "Копии {count} удалённых или стёртых аккаунтов всё ещё в бакете, потому что он отказался их удалять ({error}). Дайте учётным данным DeleteObject; удаление повторяется каждую ночь." + }, + "restoreStarted": "Восстановление начато. Его ход показывается над списком.", + "restoreActive": "Восстановление этого аккаунта уже выполняется. Дождитесь его завершения.", + "restoreJobQueuedTitle": "Восстановление {username} ожидает запуска", + "restoreJobQueuedNote": "Оно начнётся, как только фоновый воркер его подхватит.", + "restoreJobWaitingBackupNote": "Ожидание резервного копирования, выполняющегося на сервере. Восстановление никогда не идёт рядом с ним и начинается примерно через минуту после его завершения.", + "restoreJobWaitingBusyNote": "Ожидание завершения крупного задания на сервере, например импорта или ночного прохода. Оно начинается примерно через минуту после этого.", + "restoreJobQueuedSince": "Поставлено в очередь в {when}.", + "restoreJobRunningTitle": "Восстановление {username}", + "restoreJobRunningNote": "Аккаунт продолжает показывать текущие данные, пока восстановление не завершится. Вы можете покинуть эту страницу; восстановление продолжится на сервере.", + "restoreJobResumed": "Запущено снова после перезапуска сервера.", + "restoreJobPhaseValidating": "Проверка файла резервной копии: проверено {checked} измерений", + "restoreJobPhaseClearing": "Очистка текущих данных аккаунта", + "restoreJobPhaseMeasurements": "Запись измерений: {done} из {total}", + "restoreJobPhaseSections": "Запись других записей: {done} из {total} разделов", + "restoreJobPhaseRebuilding": "Перестроение графиков и сводок", + "restoreJobSucceededTitle": "Восстановление {username} завершено", + "restoreJobSucceededDescription": "Восстановлено {count} записей. Завершено {when}.", + "restoreJobFailedTitle": "Восстановление {username} не завершилось", + "restoreJobFailedKept": "Ничего не изменено. Резервная копия сохранена, поэтому вы можете снова запустить восстановление из её строки, не загружая её повторно.", + "restoreFailureNotFound": "Резервная копия была удалена до того, как восстановление смогло её прочитать.", + "restoreFailureChanged": "Резервная копия была заменена более новой, пока восстановление ждало. Проверьте новую копию, затем запустите восстановление снова.", + "restoreFailureUndecryptable": "Резервную копию не удалось расшифровать. Ключ, которым она была записана, больше не настроен, или сохранённая копия была изменена.", + "restoreFailureSchema": "Файл резервной копии не является допустимой резервной копией HealthLog.", + "restoreFailureVersion": "Резервная копия записана более новой версией HealthLog. Сначала обновите этот сервер.", + "restoreFailureOwnerMismatch": "Файл внутри резервной копии принадлежит другому аккаунту, чем строка резервной копии.", + "restoreFailureOwnerMissing": "Аккаунт, которому принадлежит эта резервная копия, больше не существует.", + "restoreFailureSectionMissing": "Файл неполный: его манифест называет раздел, которого он не содержит.", + "restoreFailureDocument": "Файл содержит документы без их содержимого, как переносимый экспорт. Используйте вместо этого одну из копий аккаунта этого сервера или внешнюю копию.", + "restoreFailureTimeBudget": "Эта резервная копия слишком велика, чтобы восстановиться в пределах лимита времени фонового задания.", + "restoreFailureTransaction": "База данных отказала в восстановлении на полпути, поэтому всё было откатано. Журнал сервера называет ошибку.", + "restoreFailureCauseTimeout": "Восстановление выполнялось дольше, чем позволяла база данных, поэтому всё было откатано. Если хост базы данных был занят, запустите восстановление снова, когда он будет свободнее. Журнал сервера называет шаг.", + "restoreFailureCauseLock": "Восстановление ждало записи, которые изменял другой процесс, поэтому всё было откатано. Запустите восстановление снова.", + "restoreFailureCauseConstraint": "База данных отклонила запись в резервной копии, поэтому всё было откатано. Журнал сервера называет таблицу и правило.", + "restoreFailureCauseStorage": "Во время восстановления в базе данных закончилось место на диске или память, поэтому всё было откатано. Освободите место на хосте базы данных, затем запустите восстановление снова.", + "restoreFailureCauseConnection": "Соединение с базой данных было потеряно во время восстановления, поэтому всё было откатано. Проверьте, что база данных работает, затем запустите восстановление снова.", + "restoreFailureInterrupted": "Восстановление остановилось при перезапуске сервера и было откатано. Если оно снова остановится, вероятно, у сервера заканчивается память.", + "restoreFailureNotStarted": "Фоновый воркер не подхватил восстановление. Проверьте, что воркер работает.", + "restoreFailureEnqueue": "Восстановление не удалось передать фоновому воркеру. Проверьте, что воркер работает.", + "restoreFailureAfterCommit": "Данные восстановлены, но шаг после этого не удался. Графики могут догнать только к следующему ночному запуску.", + "restoreFailureUnexpected": "Восстановление остановилось на неожиданной ошибке и было откатано. Журнал сервера называет ошибку.", + "restoreFailureKeyMissing": "Резервной копии нужен ключ шифрования {keys}, которым этот сервер не может её открыть. Верните ключ в ENCRYPTION_KEYS, перезапустите и запустите восстановление снова.", + "restoreFailureForeignReference": "Файл указывает на записи, принадлежащие другому аккаунту. Ничего не записано.", + "restoreFailureRowsElsewhere": "Записи в этом файле уже есть в другом аккаунте на этом сервере: тот же файл был восстановлен там раньше. Файл можно восстановить только в один аккаунт. Ничего не записано.", + "previewKeyMissing": "Эту резервную копию нельзя восстановить на этом сервере: ей нужен ключ шифрования {keys}. Верните ключ в ENCRYPTION_KEYS и сначала перезапустите.", + "restoreSkippedSymptomEpisodeReference": "Запись симптома, связанная с заболеванием, которого нет в файле (сохранена без связи)", + "restoreSkippedCycleCiphertext": "Заметка или метка цикла, запечатанная ключом, которого нет на этом сервере (день или симптом сохранён без неё)", + "restoreSkippedMoodLabelCiphertext": "Тег настроения или название группы, запечатанные ключом, которого нет на этом сервере (сохранено без названия)", + "restoreSkippedVisitCiphertext": "Текст визита или врача, запечатанный ключом, которого нет на этом сервере (сохранён без него)", + "restoreSkippedVaccinationCiphertext": "Заметка о вакцинации, запечатанная ключом, которого нет на этом сервере (доза сохранена без неё)", + "restoreSkippedEnvironmentLocationCiphertext": "Местоположение периода или дня среды, запечатанное ключом, которого нет на этом сервере (сохранено запечатанным, эти дни не обновляются)", + "typePreWipe": "Перед удалением всех данных", + "retentionNote": "Недельная копия заменяется каждое воскресенье. Копия, снятая перед «Удалить все данные», удаляется через {days} дней. Загруженные копии хранятся, пока их аккаунт не будет стёрт.", + "retentionNoteNoGrace": "Недельная копия заменяется каждое воскресенье. Загруженные копии хранятся, пока их аккаунт не будет стёрт.", + "database": { + "title": "Дамп базы данных", + "lastGood": "Последний успешный дамп {when}, {size}, {where}.", + "whereBoth": "хранится на этом сервере и вне хоста", + "whereLocal": "хранится на этом сервере", + "whereOffhost": "только вне хоста", + "none": "Дамп базы данных пока отсутствует. Первый запустится сегодня ночью.", + "failedTitle": "Последний дамп базы данных не удался", + "failedDescription": "{when}: {reason}", + "disabled": "Дампы базы данных выключены (DB_BACKUP_ENABLED=false). Создавайте резервную копию базы данных другим способом.", + "noDirectoryOffhost": "Этот сервер не может писать в {dir}, поэтому дампы идут только вне хоста, и здесь ничего не хранится. Смонтируйте том резервных копий.", + "noDirectory": "Этот сервер не может писать в {dir}, и внешний бакет не задан, поэтому дамп базы данных снять нельзя. Смонтируйте том резервных копий.", + "retentionLocal": "Удалённые аккаунты остаются в дампах, пока те не устареют: на этом сервере хранятся последние {nights} ночных дампов, а дамп, снятый перед последним обновлением, хранится до следующего обновления.", + "retentionOffhost": "Внешние копии удаляются через {days} дней по правилу жизненного цикла бакета.", + "retentionOffhostMissing": "Ни одно правило жизненного цикла в бакете не покрывает database/, поэтому дампы там, и удалённые аккаунты внутри них, никогда не удаляются. Добавьте правило для этого префикса.", + "notPersistentOffhost": "{dir} не на постоянном хранилище (он находится внутри контейнера, а не на смонтированном томе, или в памяти), поэтому дамп, записанный туда, был бы потерян при следующем обновлении. Дампы идут только вне хоста: здесь ничего не хранится и ничего не снимается перед миграцией. Смонтируйте том резервных копий.", + "notPersistent": "{dir} не на постоянном хранилище (он находится внутри контейнера, а не на смонтированном томе, или в памяти), и внешний бакет не задан, поэтому дамп базы данных нигде не хранится. Смонтируйте том резервных копий.", + "offhostFailedTitle": "Новейший дамп базы данных не дошёл до внешнего бакета", + "offhostLastUpload": "Новейший дамп в бакете от {when}.", + "offhostNeverUploaded": "Ни один дамп базы данных ещё не дошёл до бакета." + }, + "restorePreWipeLimits": "Эта копия снята до удаления данных аккаунта, и её восстановление отменяет это удаление настолько, насколько может копия: всё, что аккаунт добавил с тех пор, заменяется, а подключения интеграций, общий доступ и доступ опекунов, а также ссылки общего доступа не возвращаются.", + "target": { + "title": "Восстановить в другой аккаунт", + "description": "{file} принадлежит аккаунту, которого больше нет на этом сервере. Выберите аккаунт, в который пойдут его записи. Восстановление заменяет записи аккаунта, поэтому принять их может только аккаунт без записей. Файл загружается ещё раз.", + "choiceLabel": "Куда пойдут записи", + "newAccount": "Новый аккаунт", + "existingAccount": "Существующий аккаунт", + "usernameLabel": "Имя пользователя для нового аккаунта", + "usernameInvalid": "От 3 до 30 букв, цифр, _ или -, не начинающихся с \"managed-\".", + "newAccountHint": "Аккаунт создаётся без пароля и адреса электронной почты. Прежде чем передать его, задайте ему первый пароль через «Сбросить пароль» в разделе «Пользователи».", + "accountLabel": "Аккаунт", + "accountPlaceholder": "Выберите аккаунт", + "checking": "Проверка аккаунта…", + "eligible": "Этот аккаунт пока не содержит записей и может принять копию.", + "confirmLabel": "Введите {username}, чтобы подтвердить", + "submit": "Загрузить в этот аккаунт", + "submitting": "Загрузка…", + "success": "Резервная копия сохранена для {username} ({count} записей). Восстановите её из её строки.", + "failureHoldsRecords": "Этот аккаунт уже содержит записи. Восстановление заменяет записи, а не добавляет к ним, поэтому выберите аккаунт без записей или создайте новый.", + "failureManagedProfile": "Этот аккаунт — управляемый профиль. Им управляют люди, которые за ним смотрят, поэтому копия не может попасть в него.", + "failurePendingDeletion": "Этот аккаунт ожидает удаления. Сначала отмените удаление или выберите другой аккаунт.", + "failureAdminAccount": "Это администраторский аккаунт. Записи другого человека не могут попасть в него. Выберите обычный аккаунт или создайте новый.", + "failureNotFound": "Этот аккаунт больше не существует.", + "failureUnconfirmed": "Введите имя пользователя аккаунта точно, чтобы подтвердить.", + "failureUsernameTaken": "Это имя пользователя уже занято.", + "failureOwnerExists": "Аккаунт, которому принадлежит этот файл, есть на этом сервере, и файл восстанавливается в этот аккаунт. Загрузите его снова, не выбирая аккаунт." + } + }, + "danger-zone": { + "title": "Опасная зона", + "subtitle": "Разрушительные операции для всей системы." + }, + "about": { + "title": "О программе", + "subtitle": "Версия, лицензия и состояние обновлений." + }, + "module-availability": { + "title": "Модули", + "subtitle": "Включите или выключите модули для всех аккаунтов на этом сервере." + }, + "encryption": { + "title": "Шифрование", + "subtitle": "Покрытие шифрованием и состояние ротации ключей для данных в состоянии покоя.", + "loadError": "Не удалось загрузить состояние шифрования.", + "coverageTitle": "Покрытие", + "coverageDescription": "Сколько зашифрованных строк находится под каждым id ключа.", + "activeKeyId": "Id активного ключа", + "configuredKeys": "Настроенные ключи", + "totalRows": "Зашифрованные строки", + "staleRows": "Строки не на активном ключе", + "safeToDropLegacy": "Можно безопасно удалить устаревший ключ", + "rotationIncomplete": "{count} строк ещё нуждаются в ротации", + "rotationTitle": "Ротация ключей", + "rotationDescription": "Повторно зашифровать каждый зашифрованный столбец активным ключом.", + "rotationState": "Состояние", + "lastRun": "Последний запуск: просканировано {scanned}, повёрнуто {rotated}, ошибок {errors}.", + "rotateNow": "Повернуть сейчас", + "rotateConfirmTitle": "Повторно зашифровать всю запись?", + "rotateConfirmDescription": "Повторно зашифровывает каждый зашифрованный столбец активным ключом. Он никогда не добавляет и не удаляет ключ, и его безопасно запускать повторно. На больших аккаунтах это может занять время.", + "cancel": "Отмена", + "rotateConfirm": "Начать ротацию", + "rotateEnqueued": "Ротация начата.", + "rotateFailed": "Не удалось начать ротацию.", + "stepUpNeeded": "Требуется свежий второй фактор. Подтвердите второй фактор или используйте инструмент командной строки, если у вас не зарегистрирован второй фактор.", + "cliNote": "Для использования этой кнопки требуется второй фактор. Без него запустите scripts/rotate-encryption-key.ts из исходного чекаута этого релиза; шаги описаны в docs/ops/encryption-key-rotation.md.", + "columnsTitle": "Покрытие по столбцам", + "columnsDescription": "Каждый зашифрованный столбец с количеством строк на активном ключе против старых ключей.", + "colColumn": "Столбец", + "colTotal": "Всего", + "colActive": "На активном ключе", + "colStale": "Устаревшие", + "state": { + "idle": "Простой", + "running": "Выполняется", + "completed": "Завершено", + "failed": "Неудача" + }, + "coverageDetail": "Показываются только id ключей и количества, никогда не материал ключа.", + "backupsTitle": "Ключи, которые всё ещё нужны резервным копиям", + "backupsDescription": "Выведенный из эксплуатации ключ остаётся нужным, пока какая-либо резервная копия ниже всё ещё его перечисляет.", + "backupsStoredLine": "Ключ {key}: {count} сохранённых копий, самая старая от {when}", + "backupsUnrecordedLine": "{count} сохранённых копий были записаны до того, как резервные копии начали записывать свои ключи (самая старая от {when}). Им может понадобиться любой ключ, существовавший тогда: храните каждый старый ключ, пока они не будут заменены или удалены.", + "backupsOffhostLine": "Ключ {key}: последняя внешняя копия, которой он нужен, попала в бакет {when}; нужен там до {until}", + "backupsOffhostLineUnknown": "Ключ {key}: последняя внешняя копия, которой он нужен, попала в бакет {when}. Срок хранения в бакете неизвестен, поэтому храните ключ, пока не узнаете, что эта копия исчезла.", + "backupsNone": "Ни одна резервная копия ещё не записала нужные ей ключи.", + "backupsStillNeed": "Каждая строка повёрнута, но резервным копиям всё ещё нужны {keys}", + "backupsUnrecordedBadge": "Каждая строка повёрнута, но старым резервным копиям может всё ещё понадобиться выведенный из эксплуатации ключ", + "backupsDetail": "Ротация повторно зашифровывает каждую строку, но резервная копия хранит ключ, под которым был записан её контент, и для её восстановления нужен этот ключ. Держите выведенный из эксплуатации ключ в ENCRYPTION_KEYS, пока что-либо ниже его не перечисляет.", + "columnsShow": "Показать таблицу ({count} со строками)", + "columnsHide": "Скрыть таблицу", + "columnsShowAll": "Показать все {count} столбцов", + "columnsShowWithRows": "Только столбцы со строками", + "columnsNoneWithRows": "Ни один зашифрованный столбец пока не содержит строк.", + "backupsDumpLocalLine": "Ключ {key}: {count} дампов базы данных на этом сервере были записаны под ним; он нужен, пока хранение их не удалит.", + "backupsDumpOffhostLine": "Ключ {key}: новейший дамп базы данных, записанный под ним, попал в бакет {when}; нужен там до {until}", + "backupsDumpOffhostLineUnknown": "Ключ {key}: новейший дамп базы данных, записанный под ним, попал в бакет {when}. Как долго бакет хранит database/, неизвестно, поэтому храните ключ, пока не узнаете, что этот дамп исчез." + }, + "maintenance": { + "title": "Обслуживание таблицы измерений", + "description": "Возвращает место, занятое старыми остатками синхронизации, после того как очистка выполнена.", + "body": "Он выполняет vacuum таблицы измерений, а затем перестраивает её индексы по одному. Чтение и сохранение продолжают работать во время его выполнения. Выберите тихий час и имейте свободный диск для ещё одной копии самого большого индекса.", + "tableSize": "Таблица с индексами", + "indexSize": "Индексы", + "loading": "Проверка состояния обслуживания…", + "loadError": "Не удалось прочитать состояние обслуживания.", + "unavailable": "Фоновый воркер не подключён, поэтому обслуживание здесь не может выполняться.", + "purgePending": "Очистка старых остатков синхронизации всё ещё выполняется. Обслуживание может начаться, как только она завершится.", + "state": { + "idle": "Ещё не выполнялось.", + "queued": "Ожидание фонового воркера.", + "running": "Выполняется с {since}. На крупном экземпляре это может занять время.", + "completed": "Завершено {at}.", + "refusedPurge": "Не началось, потому что очистка всё ещё выполнялась. Запустите снова, когда очистка завершится.", + "alreadyRunning": "Не началось, потому что другой запуск уже работал.", + "failed": "Остановлено {at}. Журнал приложения называет шаг, а runbook объясняет, что проверить." + }, + "start": "Начать обслуживание", + "confirmTitle": "Начать обслуживание сейчас?", + "confirmBody": "Оно выполняется в фоне, шаг за шагом, и может занять время. Если вы сегодня не делали резервную копию, сначала сделайте её.", + "confirm": "Начать", + "cancel": "Отмена", + "started": "Обслуживание начато.", + "alreadyQueued": "Запуск обслуживания уже в очереди или выполняется.", + "startFailed": "Не удалось начать обслуживание." + }, + "pulseDayMean": { + "title": "Среднее пульса за день", + "description": "Как часы с небольшим числом измерений учитываются в пульсе за день.", + "body": "До сих пор каждый час с измерением учитывается одинаково, поэтому одно случайное измерение может сдвинуть весь день. Взвешенный метод позволяет часу учитываться полностью начиная с трёх измерений, а одиночному измерению — на треть. Сначала запустите пробный прогон, чтобы увидеть, сколько дней изменится. Применение пересчитывает сохранённые дни пульса в фоне.", + "method": { + "hourly": "Каждый час равен", + "weighted": "Разреженные часы взвешены" + }, + "loading": "Проверка среднего пульса за день…", + "loadError": "Не удалось прочитать состояние среднего пульса за день.", + "state": { + "idle": "Пробного прогона пока нет.", + "queued": "Пробный прогон ожидает фонового воркера.", + "running": "Пробный прогон выполняется.", + "done": "Пробный прогон завершён {at}.", + "failed": "Пробный прогон остановился. Журнал приложения называет причину; запустите его снова." + }, + "result": { + "days": "Сравнено дней", + "changed": "Дней, сдвинувшихся более чем на 1 уд/мин", + "max": "Наибольшее изменение", + "maxValue": "{value} уд/мин", + "bucket": "{range} уд/мин", + "account": "Аккаунт {account}", + "accountDays": "{changed} из {days} дней сдвигаются" + }, + "appliedAt": "Взвешенный метод применён {at}.", + "dryRun": "Пробный прогон", + "apply": "Применить", + "confirmTitle": "Применить взвешенное среднее пульса за день?", + "confirmBody": "Дни пульса каждого аккаунта затем вычисляются с взвешиванием разреженных часов. Сохранённые дни пульса пересчитываются в фоне, что на крупном экземпляре может занять время.", + "confirm": "Применить", + "cancel": "Отмена", + "dryRunStarted": "Пробный прогон начат.", + "applied": "Взвешенный метод применён. Дни пульса пересчитываются.", + "appliedNoRebuild": "Взвешенный метод применён. Другой запуск всё ещё работает, поэтому примените снова, когда он завершится, чтобы пересчитать дни пульса.", + "error": { + "busy": "Пробный прогон или пересчёт всё ещё выполняется. Попробуйте снова, когда он завершится.", + "dryRunRequired": "Сначала запустите пробный прогон. Для применения нужен тот, что завершился за последние семь дней.", + "generic": "Запрос не прошёл." + }, + "rebuild": { + "queued": "Пересчёт ожидает фонового воркера.", + "running": "Дни пульса пересчитываются.", + "done": "Дни пульса пересчитаны {at} для {accounts} аккаунтов.", + "failed": "Пересчёт остановился. Журнал приложения называет причину; запустите его снова." + }, + "rebuildAgain": "Пересчитать снова", + "rebuildStarted": "Пересчёт начат." + } + }, + "carrier": "Оператор", + "mfaRequired": "Требовать второй фактор", + "mfaRequiredDescription": "Аккаунты без второго фактора после веб-входа отправляются его настроить; доступ через API и нативные (Bearer) клиенты остаётся открытым.", + "mfaEnforcedOn": "MFA включена", + "mfaEnforcedOff": "MFA выключена", + "mfaEnforcedOnHint": "Для этого пользователя требуется второй фактор. Нажмите, чтобы перестать его требовать.", + "mfaEnforcedOffHint": "Требовать второй фактор для этого пользователя.", + "copyIp": "Копировать IP-адрес", + "ipCopied": "IP-адрес скопирован", + "copyFailed": "Не удалось скопировать.", + "documentMaxFile": "Лимит загрузки документов", + "documentMaxFileDescription": "Ограничение размера одного файла для хранилища документов (1–100 МБ).", + "documentQuota": "Квота хранилища документов", + "documentQuotaDescription": "Хранилище документов по умолчанию на аккаунт (0,1–1024 ГБ).", + "userDocumentQuota": "Переопределение квоты документов", + "userDocumentQuotaDefault": "По умолчанию", + "userDocumentQuotaHint": "Оставьте пустым, чтобы использовать значение экземпляра по умолчанию.", + "centralCodex": { + "title": "Общее подключение ИИ", + "description": "Подключите один аккаунт ChatGPT с выполненным входом, к которому любой пользователь на этом сервере может подключиться для функций ИИ.", + "honesty": "Это единый общий аккаунт ИИ с выполненным входом, а не ключ API. Каждый подключившийся пользователь отправляет запросы через него, поэтому почасовые и недельные лимиты аккаунта делятся между всеми ними, и те же лимиты уже питают Коуча. Провайдеры по подписке могут использовать контент для улучшения своих моделей, и никакое соглашение об обработке данных его не покрывает, поэтому он никогда не используется по умолчанию и остаётся ниже провайдеров без обучения при чтении документов. Подключайте только аккаунт, которым вам комфортно так делиться.", + "statusConnected": "Подключено", + "statusDisconnected": "Не подключено", + "statusExpired": "Истекло", + "connectButton": "Подключить аккаунт ChatGPT", + "disconnectButton": "Отключить", + "disconnectTitle": "Отключить общий аккаунт ИИ?", + "disconnectBody": "Каждый пользователь на этом сервере, полагающийся на общее подключение, теряет функции ИИ, пока кто-нибудь снова не привяжет аккаунт. Сохранённый вход восстановить нельзя.", + "disconnectConfirm": "Отключить", + "connectedSince": "Подключено с {when}", + "connected": "Общее подключение ИИ привязано", + "disconnected": "Общее подключение ИИ удалено", + "error": "Что-то пошло не так. Попробуйте снова" + }, + "failingJobs": { + "title": "Фоновые задания", + "description": "Очереди, задания которых сдались после исчерпания повторных попыток.", + "none": "За последние {hours} часов ни одно задание не завершилось неудачей.", + "unavailable": "Нет очереди заданий для чтения. Это развёртывание работает без фонового воркера.", + "countOne": "{count} неудача", + "countFew": "{count} неудачи", + "countOther": "{count} неудач", + "lastFailed": "Последняя неудача {when}" + }, + "deleteAllDetail": "Аккаунты пользователей будут сохранены.", + "cardError": { + "title": "Эту часть страницы не удалось показать", + "description": "Остальная часть страницы работает; попробуйте снова или перезагрузите, если это повторяется." + }, + "keyMismatch": { + "title": "HealthLog не может открыть свои данные", + "body": "Ключ шифрования, с которым был запущен этот сервер, не тот ключ, которым была записана его база данных. Чтобы защитить ваши данные, HealthLog ничего не отдаёт, пока это не исправлено.", + "fixTitle": "Как это исправить", + "fixRestore": "Верните исходный ENCRYPTION_KEY (или запись ENCRYPTION_KEYS) в настройки сервера.", + "fixDatabase": "Или укажите DATABASE_URL на базу данных, которая принадлежит этому ключу.", + "fixFresh": "Или начните заново с пустой базой данных. Старые данные и их резервные копии можно прочитать только старым ключом.", + "restartNote": "Перезапустите HealthLog после изменения.", + "lastResort": "Крайняя мера, только если вы уверены, что ключ верный, и ни один из трёх вариантов не подходит: задайте {setting} и перезапустите. Тогда HealthLog всё равно будет отдавать данные и только запишет находку в журнал. Это отключает проверку безопасности: с неверным ключом каждое зашифрованное значение не расшифровывается, а новые данные записываются под этим ключом.", + "codes": "Для оператора: запросы API отвечают 503 с кодом ошибки {code}, а /api/health сообщает причину {reason}." + }, + "loginOverviewCardTitle": "События входа", + "userColumn": "Пользователь", + "supportReport": { + "title": "Отчёт поддержки", + "description": "Сводка этого экземпляра для отчёта об ошибке, без адресов электронной почты, ID и значений.", + "body": "Аккаунты отображаются как «Аккаунт 1», «Аккаунт 2» и так далее. Прочитайте отчёт, прежде чем делиться им.", + "copy": "Копировать", + "copied": "Скопировано", + "download": "Скачать", + "loadError": "Не удалось создать отчёт поддержки." + }, + "aiUsage": { + "title": "Уровни использования ИИ", + "description": "Наивысший уровень, который могут выбрать аккаунты, и уровень, с которого они начинают.", + "maxLabel": "Наивысший уровень", + "defaultLabel": "Уровень по умолчанию", + "defaultAboveCeiling": "Уровень по умолчанию не может быть выше наивысшего уровня.", + "gapLabel": "Часы между обновлениями карточек после синхронизации (Стандартный)", + "gapHint": "Целые часы от 1 до 48. Оставьте пустым, чтобы использовать AI_SYNC_REGEN_GAP_HOURS, иначе 6. Сейчас действует: {hours} ч." + }, + "recoveryKit": { + "title": "Комплект восстановления", + "description": "Каждый ключ, нужный для восстановления этого сервера, по id и отпечатку.", + "intro": "Храните копию каждого ключа ниже вне этого сервера, например в менеджере паролей. Без них ни дамп базы данных, ни резервную копию нельзя будет прочитать снова, и HealthLog откажется запускаться, если нужный ему ключ отсутствует.", + "loading": "Загрузка комплекта восстановления…", + "loadError": "Не удалось загрузить комплект восстановления.", + "badgeDue": "Сделать", + "badgeDone": "Сохранено", + "keyId": "Id", + "fingerprint": "Отпечаток", + "noFingerprint": "Не на этом сервере", + "kind": { + "application": "Ключ приложения {id}", + "backup": "Ключ внешнего резервного копирования", + "backupPrevious": "Предыдущий ключ внешнего резервного копирования", + "token": "Ключ токенов" + }, + "need": { + "active": "Шифрует новые данные.", + "configured": "Хранится этим сервером.", + "storedCopies": "Нужен {count} сохранённым копиям.", + "offhostUntil": "Нужен внешним копиям до {date}.", + "offhostUnknown": "Нужен внешним копиям, пока бакет их хранит.", + "backupActive": "Запечатывает каждую новую внешнюю копию.", + "backupPrevious": "Открывает внешние копии, записанные до последней смены ключа.", + "token": "Подписывает сеансы, токены и ссылки общего доступа. Без него все выходят из системы, но данные не теряются.", + "localDumps": "Нужен {count} дампам базы данных на этом сервере.", + "offhostDumpsUntil": "Нужен внешним дампам базы данных до {date}.", + "offhostDumpsUnknown": "Нужен внешним дампам базы данных, пока бакет их хранит." + }, + "source": "Задан в {variable}.", + "status": { + "confirmed": "Сохранено", + "new": "Ещё не сохранено", + "notConfigured": "Не на этом сервере", + "unreadable": "Недействительный ключ" + }, + "notConfiguredHint": "Резервной копии всё ещё нужен этот ключ, а этот сервер его не хранит. Прочитать эти резервные копии может только копия, которую вы храните в другом месте. Подтвердите комплект, когда у вас будет эта копия.", + "unreadableHint": "Переменная задана, но не содержит действительного ключа. Исправьте её, прежде чем полагаться на внешние копии.", + "fingerprintHint": "Отпечаток — это первые 12 символов хеша SHA-256 ключа. Он идентифицирует ключ, не раскрывая его, поэтому вы можете сравнить его со своей копией.", + "whereTitle": "Где заданы ключи", + "platform": { + "composeLabel": "Compose", + "composeWhere": "Ключи находятся в файле .env рядом с docker-compose.yml: ENCRYPTION_KEY или ENCRYPTION_KEYS, API_TOKEN_HMAC_KEY и, при внешних копиях, BACKUP_ENCRYPTION_KEY.", + "truenasLabel": "TrueNAS", + "truenasWhere": "Откройте Apps, выберите HealthLog и нажмите Edit. Ключи находятся в разделе HealthLog Configuration; в приложении, установленном через YAML, это ENCRYPTION_KEY, API_TOKEN_HMAC_KEY и BACKUP_ENCRYPTION_KEY в настройках окружения.", + "coolifyLabel": "Coolify", + "coolifyWhere": "Откройте приложение в Coolify и скопируйте ENCRYPTION_KEY, API_TOKEN_HMAC_KEY и BACKUP_ENCRYPTION_KEY из его Environment Variables.", + "unraidLabel": "Unraid", + "unraidWhere": "На вкладке Docker отредактируйте контейнер HealthLog и скопируйте ENCRYPTION_KEY, API_TOKEN_HMAC_KEY и BACKUP_ENCRYPTION_KEY из шаблона или из .env вашего стека Compose Manager.", + "portainerLabel": "Portainer", + "portainerWhere": "Откройте стек HealthLog в Portainer и скопируйте ENCRYPTION_KEY, API_TOKEN_HMAC_KEY и BACKUP_ENCRYPTION_KEY из его переменных окружения." + }, + "restoreTitle": "Восстановление этого сервера", + "restoreBody": "Установите HealthLog с теми же ключами, восстановите новейший дамп базы данных в пустую базу данных, затем запустите приложение. Руководство описывает каждый шаг.", + "restoreLink": "Руководство по аварийному восстановлению", + "checkLabel": "Проверить мою копию", + "checkKeyLabel": "Ключ для проверки", + "checkValueLabel": "Ваша копия ключа", + "checkButton": "Проверить", + "checkNote": "Вставленный ключ сравнивается с тем, что хранит этот сервер, и затем отбрасывается. Он никогда не сохраняется и не записывается в журнал.", + "checkInsecureNote": "Эта страница не отдаётся по https://, поэтому вставленный ключ передаётся по сети незашифрованным, как и ваш пароль. Он сравнивается и отбрасывается, никогда не сохраняется и не записывается в журнал.", + "checkMatches": "Ваша копия совпадает с этим ключом.", + "checkNoMatch": "Ваша копия не совпадает с этим ключом. Проверьте, что вы скопировали всё значение.", + "checkFailed": "Проверка не удалась.", + "confirmButton": "У меня есть копия каждого ключа", + "confirmed": "Комплект восстановления подтверждён.", + "confirmFailed": "Не удалось сохранить подтверждение.", + "stale": "Комплект изменился с момента загрузки этой страницы. Проверьте ключи, которые он теперь перечисляет, затем подтвердите снова.", + "confirmedAt": "Подтверждено {date}.", + "confirmedAtBy": "Подтверждено {date} пользователем {who}.", + "dueAgain": "Комплект был подтверждён {date}. Теперь он также перечисляет {keys}, которые это подтверждение не покрывало. Сохраните копию каждого и подтвердите снова." + }, + "recoveryReadiness": { + "title": "Готовность к восстановлению", + "description": "Можно ли вернуть этот сервер после потери, судя по каждой создаваемой им резервной копии.", + "loading": "Проверка резервных копий…", + "loadError": "Не удалось загрузить готовность к восстановлению.", + "state": { + "ok": "Готово", + "attention": "Требует внимания", + "failing": "Под угрозой" + }, + "signal": { + "database_dump": "Дамп базы данных", + "weekly_copy": "Недельные копии аккаунтов", + "offhost_copies": "Внешние копии", + "restore_drill": "Учебное восстановление", + "offhost_setup": "Внешнее резервное копирование", + "recovery_kit": "Комплект восстановления", + "dump_retention": "Дампы в бакете" + }, + "at": { + "database_dump": "Новейший дамп: {date}", + "weekly_copy": "Самая старая копия аккаунта: {date}", + "offhost_copies": "Наименее свежая внешняя копия: {date}", + "restore_drill": "Последнее учебное восстановление: {date}", + "recovery_kit": "Подтверждено: {date}" + }, + "dueBy": "Срок до {date}", + "fix": { + "database_dump": "Открыть резервные копии", + "weekly_copy": "Открыть резервные копии", + "offhost_copies": "Открыть резервные копии", + "restore_drill": "Открыть резервные копии", + "offhost_setup": "Открыть резервные копии", + "recovery_kit": "Открыть комплект", + "dump_retention": "Открыть резервные копии" + }, + "reason": { + "database_dump": { + "not_available": "Эта версия не планирует дамп базы данных.", + "disabled": "Запланированный дамп базы данных выключен, поэтому ни одна копия не может восстановить этот сервер. Чтобы снова его включить, удалите DB_BACKUP_ENABLED или установите его в true, затем перезапустите HealthLog.", + "unreadable": "Не удалось прочитать состояние дампа базы данных.", + "never_succeeded": "Ни один дамп базы данных ещё не удался успешно, и последняя попытка не удалась.", + "never_ran": "За {hours} часов с момента включения дампов ни один дамп базы данных не был записан.", + "first_pending": "Первый дамп базы данных ещё не выполнялся.", + "stale": "Новейший дамп базы данных имеет возраст {hours} часов.", + "last_failed": "Последний дамп базы данных не удался. Предыдущий всё ещё свежий.", + "fresh": "Новейший дамп базы данных свежий.", + "nowhere_to_write": "В каталог дампов {directory} нельзя писать, и внешний бакет не настроен, поэтому ни один дамп нельзя сохранить.", + "not_persistent": "Каталог дампов {directory} не на постоянном хранилище, и внешний бакет не настроен, поэтому каждый дамп был бы потерян при следующем обновлении. Смонтируйте том резервных копий.", + "fresh_offhost_only": "Новейший дамп базы данных свежий и находится во внешнем бакете. На этом сервере ничего не хранится, потому что {directory} не на постоянном хранилище, и ничего не снимается перед миграцией.", + "offhost_failed": "Новейший дамп базы данных хранится на этом сервере, но его загрузка во внешний бакет не удалась.", + "offhost_stale": "За {hours} часов ни один дамп базы данных не дошёл до внешнего бакета: загрузки продолжают терпеть неудачу. Если этот сервер будет потерян, свежего дампа для его восстановления нет.", + "offhost_never": "Ни один дамп базы данных никогда не доходил до внешнего бакета: загрузка не удаётся. Если этот сервер будет потерян, дампа для его восстановления нет." + }, + "weekly_copy": { + "no_accounts": "Пока нет аккаунтов для копирования.", + "stale": "Самая старая недельная копия имеет возраст {days} дней. Отстают аккаунты: {accounts}.", + "never": "У аккаунта не было недельной копии {days} дней. Отстают аккаунты: {accounts}.", + "first_pending": "Первая недельная копия создаётся рано в воскресенье.", + "fresh": "У каждого аккаунта есть копия за последнюю неделю." + }, + "offhost_copies": { + "not_configured": "Внешний бакет не настроен.", + "stale": "Внешние копии отстают более чем на две ночи. Отстают аккаунты: {accounts}.", + "first_pending": "Ночной внешний запуск ещё не дошёл ни до одного аккаунта.", + "fresh": "У каждого аккаунта есть свежая копия во внешнем бакете." + }, + "restore_drill": { + "not_configured": "Учебное восстановление читает внешний бакет, который не настроен.", + "not_run_yet": "Ежемесячное учебное восстановление ещё не выполнялось.", + "failed": "Последнее учебное восстановление не удалось: {failed} из {checked} копий не удалось прочитать обратно.", + "failed_run": "Последнее учебное восстановление не смогло завершиться.", + "passed": "Последнее учебное восстановление прочитало обратно {checked} копий.", + "nothing_checked": "Последнее учебное восстановление остановилось на своём лимите времени, не прочитав обратно ни одной копии, поэтому оно ничего не доказало." + }, + "offhost_setup": { + "configured": "Копии покидают этот сервер каждую ночь.", + "no_admin": "Администраторского аккаунта пока нет.", + "not_configured": "Внешний бакет не настроен, поэтому каждая копия живёт только на этом сервере.", + "not_configured_grace": "Внешний бакет пока не настроен, поэтому каждая копия живёт только на этом сервере." + }, + "recovery_kit": { + "confirmed": "Хранится копия каждого ключа, нужного для восстановления.", + "out_of_date": "Комплект восстановления теперь также перечисляет {keys}, которые последнее подтверждение не покрывало. Ничего не сломано: сохраните копию и подтвердите комплект снова.", + "no_admin": "Администраторского аккаунта пока нет.", + "not_confirmed": "Никто не подтвердил копию ключей, нужных для восстановления: {keys}.", + "not_confirmed_grace": "Сохраните копию ключей, нужных для восстановления: {keys}." + }, + "dump_retention": { + "not_configured": "Внешний бакет не настроен.", + "no_offhost_dumps": "Ни один дамп базы данных не идёт в бакет.", + "missing": "Ни одно правило жизненного цикла в бакете не покрывает database/, поэтому дампы там, и удалённые аккаунты внутри них, никогда не удаляются. Добавьте правило для этого префикса.", + "configured": "Бакет удаляет дампы через {days} дней.", + "unknown": "Бакет не сообщает, удаляет ли правило старые дампы. Проверьте, что правило жизненного цикла покрывает database/." + } + }, + "recovered": { + "database_dump": "Дамп базы данных снова свежий.", + "weekly_copy": "У каждого аккаунта снова есть свежая недельная копия.", + "offhost_copies": "У каждого аккаунта снова есть свежая внешняя копия.", + "restore_drill": "Учебное восстановление снова прошло успешно.", + "offhost_setup": "Внешние копии теперь настроены.", + "recovery_kit": "Комплект восстановления снова подтверждён.", + "dump_retention": "Правило жизненного цикла в бакете теперь покрывает дампы базы данных." + } + } + }, + "achievements": { + "title": "Достижения", + "subtitle": "Зарабатывайте достижения, отслеживая здоровье и принимая лекарства вовремя.", + "loginRequired": "Войдите, чтобы просмотреть достижения.", + "points": "Баллы", + "unlocked": "Открыто", + "nextGoal": "Следующая цель", + "allCompleted": "Все достижения открыты!", + "completed": "Завершено", + "goalReached": "Цель достигнута", + "remainingUnlocks": "{count} ещё можно открыть", + "noneUnlockedYet": "Достижения пока не открыты.", + "pointsValue": "{points} баллов", + "metricCount": "{count}", + "metricDaysOne": "{count} день", + "metricDaysFew": "{count} дня", + "metricDaysOther": "{count} дней", + "metricPercent": "{count}%", + "badges": { + "intakeTotal1": { + "title": "Первый приём", + "description": "Запишите первое событие приёма лекарства." + }, + "intakeTotal10": { + "title": "Начало приёма", + "description": "Запишите 10 событий приёма лекарств." + }, + "intakeTotal50": { + "title": "Приём в привычку", + "description": "Запишите 50 событий приёма лекарств." + }, + "intakeTotal150": { + "title": "Эксперт по приёму", + "description": "Запишите 150 событий приёма лекарств." + }, + "intakeTotal300": { + "title": "Легенда приёма", + "description": "Запишите 300 событий приёма лекарств." + }, + "passkeyCreated1": { + "title": "Ключ доступа настроен", + "description": "Создайте свой первый ключ доступа." + }, + "passkeyLogin1": { + "title": "Вход по ключу доступа", + "description": "Войдите хотя бы один раз по ключу доступа." + }, + "passwordLogin1": { + "title": "Старая школа", + "description": "Войдите хотя бы один раз по имени пользователя и паролю." + }, + "loginStreak7": { + "title": "Серия входов 7 дней", + "description": "Входите 7 дней подряд." + }, + "loginStreak30": { + "title": "Серия входов 30 дней", + "description": "Входите 30 дней подряд." + }, + "onTimePerfect1": { + "title": "Вовремя 1 день", + "description": "Принимайте все лекарства вовремя 1 день." + }, + "compliance801": { + "title": "Приверженность 80% за 1 день", + "description": "Достигните приверженности не менее 80% за 30 дней в течение 1 дня." + }, + "bmiGreen1": { + "title": "ИМТ в норме 1 день", + "description": "Держите ИМТ в нормальном диапазоне 1 день." + }, + "bpGreen1": { + "title": "АД в норме 1 день", + "description": "Держите АД в нормальном диапазоне 1 день." + }, + "pulseGreen1": { + "title": "Пульс в норме 1 день", + "description": "Держите пульс в покое в нормальном диапазоне 1 день." + }, + "onTimePerfect7": { + "title": "Вовремя 7 дней", + "description": "Принимайте все лекарства вовремя 7 дней подряд." + }, + "compliance807": { + "title": "Приверженность 80% за 7 дней", + "description": "Достигните приверженности не менее 80% за 30 дней в течение 7 дней подряд." + }, + "bmiGreen7": { + "title": "ИМТ в норме 7 дней", + "description": "Держите ИМТ в нормальном диапазоне 7 дней подряд." + }, + "bpGreen7": { + "title": "АД в норме 7 дней", + "description": "Держите АД в нормальном диапазоне 7 дней подряд." + }, + "pulseGreen7": { + "title": "Пульс в норме 7 дней", + "description": "Держите пульс в покое в нормальном диапазоне 7 дней подряд." + }, + "onTimePerfect30": { + "title": "Вовремя 30 дней", + "description": "Принимайте все лекарства вовремя 30 дней подряд." + }, + "compliance8030": { + "title": "Приверженность 80% за 30 дней", + "description": "Достигните приверженности не менее 80% за 30 дней в течение 30 дней подряд." + }, + "bmiGreen30": { + "title": "ИМТ в норме 30 дней", + "description": "Держите ИМТ в нормальном диапазоне 30 дней подряд." + }, + "bpGreen30": { + "title": "АД в норме 30 дней", + "description": "Держите АД в нормальном диапазоне 30 дней подряд." + }, + "pulseGreen30": { + "title": "Пульс в норме 30 дней", + "description": "Держите пульс в покое в нормальном диапазоне 30 дней подряд." + }, + "onTimePerfect180": { + "title": "Вовремя 180 дней", + "description": "Принимайте все лекарства вовремя 180 дней подряд." + }, + "compliance80180": { + "title": "Приверженность 80% за 180 дней", + "description": "Достигните приверженности не менее 80% за 30 дней в течение 180 дней подряд." + }, + "bmiGreen180": { + "title": "ИМТ в норме 180 дней", + "description": "Держите ИМТ в нормальном диапазоне 180 дней подряд." + }, + "bpGreen180": { + "title": "АД в норме 180 дней", + "description": "Держите АД в нормальном диапазоне 180 дней подряд." + }, + "pulseGreen180": { + "title": "Пульс в норме 180 дней", + "description": "Держите пульс в покое в нормальном диапазоне 180 дней подряд." + }, + "onTimePerfect360": { + "title": "Вовремя 360 дней", + "description": "Принимайте все лекарства вовремя 360 дней подряд." + }, + "compliance80360": { + "title": "Приверженность 80% за 360 дней", + "description": "Достигните приверженности не менее 80% за 30 дней в течение 360 дней подряд." + }, + "bmiGreen360": { + "title": "ИМТ в норме 360 дней", + "description": "Держите ИМТ в нормальном диапазоне 360 дней подряд." + }, + "bpGreen360": { + "title": "АД в норме 360 дней", + "description": "Держите АД в нормальном диапазоне 360 дней подряд." + }, + "pulseGreen360": { + "title": "Пульс в норме 360 дней", + "description": "Держите пульс в покое в нормальном диапазоне 360 дней подряд." + }, + "moodFirst": { + "title": "Первое настроение", + "description": "Запишите первую запись настроения." + }, + "moodStreak7": { + "title": "Дневник настроения 7 дней", + "description": "Записывайте настроение 7 дней подряд." + }, + "moodStreak30": { + "title": "Дневник настроения 30 дней", + "description": "Записывайте настроение 30 дней подряд." + }, + "moodUp7": { + "title": "Более светлая неделя", + "description": "Ваше среднее настроение за 7 дней улучшилось не менее чем на 1,0 балла по сравнению с предыдущей неделей." + }, + "weightFirst": { + "title": "Первое взвешивание", + "description": "Запишите первое измерение веса." + }, + "weight50": { + "title": "Пятьдесят взвешиваний", + "description": "Запишите 50 измерений веса." + }, + "weight200": { + "title": "200 взвешиваний", + "description": "Запишите 200 измерений веса." + }, + "bpFirst": { + "title": "Первое измерение", + "description": "Запишите первое измерение АД." + }, + "bp50": { + "title": "Пятьдесят измерений АД", + "description": "Запишите 50 измерений АД." + }, + "bp200": { + "title": "200 измерений АД", + "description": "Запишите 200 измерений АД." + }, + "pulseFirst": { + "title": "Первый пульс", + "description": "Запишите первое измерение пульса." + }, + "consistentMonth": { + "title": "Стабильный месяц", + "description": "Записывайте записи не менее чем в 25 разных днях в пределах одного календарного месяца." + }, + "entryStreak7": { + "title": "Серия записей 7 дней", + "description": "Записывайте хотя бы одну запись 7 дней подряд." + }, + "entryStreak30": { + "title": "Серия записей 30 дней", + "description": "Записывайте хотя бы одну запись 30 дней подряд." + }, + "weekendWarrior": { + "title": "Отслеживание по выходным", + "description": "Записывайте записи 4 выходных подряд (суббота + воскресенье)." + }, + "hiddenNightOwl": { + "title": "Полуночник", + "description": "Записали запись между 02:00 и 04:00 утра." + }, + "hiddenEarlyBird": { + "title": "Ранняя пташка", + "description": "Записали запись между 04:00 и 06:00 утра." + }, + "hiddenLeapDay": { + "title": "Легенда високосного дня", + "description": "Записали запись 29 февраля." + }, + "hiddenDoctorPdf": { + "title": "Визит на дом", + "description": "Экспортировали первый PDF-отчёт для врача." + }, + "hiddenLocaleFlip": { + "title": "Полиглот", + "description": "Переключили язык приложения хотя бы один раз." + }, + "missFree7": { + "title": "Ни одной пропущенной дозы за 7 дней", + "description": "7 дней подряд без пропущенной дозы." + }, + "missFree30": { + "title": "Ни одной пропущенной дозы за 30 дней", + "description": "30 дней подряд без пропущенной дозы." + }, + "missFree90": { + "title": "Ни одной пропущенной дозы за 90 дней", + "description": "90 дней подряд без пропущенной дозы." + }, + "measurementWeeks4": { + "title": "Привычка измерять", + "description": "4 недели подряд с измерениями не менее чем в 5 дней каждой." + }, + "selfContextComplete": { + "title": "Самоописание заполнено", + "description": "Заполнены все четыре поля самоописания. Коуч знает ваш контекст." + }, + "sleepLog7": { + "title": "Дневник сна за 7 дней", + "description": "Данные сна записаны 7 дней подряд." + } + }, + "nextProgressLabel": "Прогресс до открытия", + "completedOn": "Завершено {date}", + "locked": "Заблокировано", + "criterionHint": "{current} / {target}", + "progressPercent": "{percent}%", + "categories": { + "medication": "Лекарства", + "vitals": "Показатели", + "mood": "Настроение", + "security": "Аккаунт и безопасность", + "engagement": "Вовлечённость", + "hidden": "Скрытые" + }, + "hiddenCard": { + "title": "Скрытое достижение", + "description": "Продолжайте отслеживать. Возможно, вы случайно наткнётесь на него.", + "ariaLabel": "Скрытое заблокированное достижение" + }, + "hiddenUnlockToast": { + "title": "Вы открыли скрытое достижение!" + }, + "dashboardCard": { + "title": "Недавние открытия", + "viewAll": "Показать все", + "empty": "Достижений пока нет. Продолжайте записывать, чтобы открыть первое." + } + }, + "notifications": { + "title": "Уведомления", + "eventColumn": "Событие", + "subtitle": "Выберите, какие уведомления и через какой канал вы хотите получать.", + "loadError": "Не удалось загрузить настройки уведомлений.", + "noChannels": "Сначала настройте канал уведомлений в разделе Настройки → Интеграции.", + "goToSettings": "Перейти к настройкам каналов", + "channelDisabled": "Выключено", + "admin": { + "deployFailedTitle": "Сбой развёртывания: {application}", + "deployFailedBody": "При развёртывании {application} (#{deployment}) произошла ошибка: {error}. Журнал: {logsUrl}", + "testNotificationTitle": "Тестовое уведомление HealthLog", + "testNotificationBody": "Это тестовое уведомление отправлено из панели администратора. Если вы его видите, канал работает.", + "reminderCheckMissedTitle": "Напоминание пропущено: {medication}", + "reminderCheckMissedBody": "{medication} ({dose}) не отмечено в окне {window}.", + "reminderCheckOverdueTitle": "Доза просрочена: {medication}", + "reminderCheckOverdueBody": "{medication} ({dose}) в окне {window} просрочено на {minutes} мин.", + "offlineGeoUnavailableTitle": "Офлайн-базы геолокации не загружены", + "offlineGeoUnavailableBody": "HealthLog определяет местоположение при входе через онлайн-сервис {host}, поэтому каждый IP-адрес входа покидает этот сервер. Чтобы определять его локально, скачайте базы GeoLite2-City и GeoLite2-ASN с бесплатным аккаунтом MaxMind, смонтируйте каталог в контейнер и укажите его в GEOLITE2_DIR. Шаги: {docsUrl}", + "tlsPinChangedTitle": "Конечный TLS-сертификат изменился: {host}", + "tlsPinChangedBody": "Конечный TLS-сертификат, который отдаёт {host}, теперь имеет SPKI-пин {servedPin}, которого нет в наборе известных пинов. Клиенты с закреплённым пином (нативное приложение) не смогут подключиться, как только старый пин исчезнет. Извлеките новый пин конечного сертификата, добавьте его в TLS_LEAF_SPKI_PINS и в набор пинов нативного клиента и выпустите сборку до истечения этого сертификата {validTo}. См. docs/ops/tls-cert-pin.md.", + "accountErasureRefusedTitle": "Не удалось удалить аккаунт: {username}", + "accountErasureRefusedBody": "Срок удаления {username} истёк, но аккаунт — последний активный опекун управляемого профиля, поэтому он не удалён. Он остаётся заблокированным. Добавьте профилю другого опекуна, удалите профиль или отмените удаление в разделе Администрирование, Пользователи.", + "accountErasureFailedBody": "Срок удаления {username} истёк, но удалить аккаунт не удалось. Он остаётся заблокированным, и попытка повторяется каждый час после остальных аккаунтов с наступившим сроком. Ошибка указана в карточке сбоящих заданий в разделе Администрирование." + }, + "user": { + "telegramTestBody": "HealthLog: подключение успешно. Уведомления в Telegram активны." + }, + "moodReminder": { + "title": "Ежедневное напоминание о настроении", + "description": "Мягкое напоминание в выбранное время, если настроение за день ещё не отмечено.", + "toggleAria": "Включить или выключить ежедневное напоминание о настроении", + "statusOn": "Активно в выбранное время", + "statusOff": "Выключено", + "enabledToast": "Напоминание о настроении включено.", + "disabledToast": "Напоминание о настроении выключено.", + "saveError": "Не удалось сохранить. Попробуйте ещё раз.", + "hourLabel": "Время напоминания", + "hourAria": "Час напоминания о настроении", + "hourSavedToast": "Время напоминания обновлено", + "detail": "Отправляется только через уже настроенные каналы (Telegram, ntfy, Web Push, Apple Push) и молчит, если настроение за сегодня уже отмечено." + }, + "coachNudge": { + "title": "Проактивный Coach", + "description": "Обращается, когда ваши данные подсказывают заглянуть в Coach.", + "toggleAria": "Включить или выключить проактивные напоминания Coach", + "statusOn": "Активно", + "statusOff": "Выключено", + "groupsLabel": "Темы", + "groupMedication": "Лекарства", + "groupMedicationDesc": "Неравномерный приём за последнюю неделю.", + "groupVitals": "Показатели", + "groupVitalsDesc": "АД, восстановление, динамика веса, сон.", + "groupRoutine": "Режим", + "groupRoutineDesc": "Резкие остановки отслеживания и проверки самоконтекста.", + "frequencyLabel": "Частота", + "frequencyWeekly": "Не чаще раза в неделю", + "frequencyBiweekly": "Не чаще раза в две недели", + "frequencyAria": "Выберите частоту напоминаний", + "enabledToast": "Проактивные напоминания Coach включены.", + "disabledToast": "Проактивные напоминания Coach выключены.", + "saveError": "Не удалось сохранить. Попробуйте позже.", + "aiComposedLabel": "Пусть Coach формулирует напоминание", + "aiComposedDesc": "Если провайдер доступен, проактивное напоминание пишет модель, а не фиксированный шаблон. По умолчанию выключено.", + "aiComposedAria": "Включить или выключить проактивное напоминание, написанное ИИ" + }, + "lowStock": { + "title": "Оповещение о низком запасе", + "description": "Ежедневно сообщает, когда запаса хватает меньше чем на указанное число дней.", + "toggleAria": "Включить или выключить оповещения о низком запасе", + "statusOn": "Активно", + "statusOff": "Выключено", + "daysLabel": "Уведомлять при запасе меньше (дней)", + "daysAria": "Выберите порог низкого запаса в днях", + "leadLabel": "Запас времени на заказ (дней)", + "leadAria": "Запас времени на заказ в днях", + "leadHelp": "Оповещение срабатывает на столько дней плюс один интервал между дозами раньше, чтобы новая упаковка пришла до последней дозы. Отдельное лекарство может переопределить это на вкладке запаса.", + "leadSavedToast": "Запас времени на заказ сохранён", + "savedToast": "Порог низкого запаса сохранён", + "enabledToast": "Оповещения о низком запасе включены.", + "disabledToast": "Оповещения о низком запасе выключены.", + "saveError": "Не удалось сохранить. Попробуйте ещё раз.", + "medicationsLink": "Перейти к лекарствам", + "detail": "Одно уведомление на каждый дефицит; после пополнения оно снова взводится." + }, + "eventMedicationReminder": "Напоминание о лекарстве", + "eventMedicationReminderDesc": "Отправляется в каждое запланированное время приёма.", + "eventMeasurementAnomaly": "Необычное измерение", + "eventMeasurementAnomalyDesc": "Отправляется, когда измерение заметно выходит за ваш обычный диапазон.", + "eventComplianceLow": "Низкая приверженность", + "eventComplianceLowDesc": "Отправляется, когда приверженность за последние несколько дней падает ниже 80 %.", + "eventWithingsSyncFailed": "Сбой синхронизации Withings", + "eventWithingsSyncFailedDesc": "Отправляется, когда синхронизация Withings не удаётся несколько раз подряд.", + "eventSystemAlert": "Системное уведомление", + "eventSystemAlertDesc": "Общие сообщения от сервера HealthLog, например об окнах обслуживания или заметки об аккаунте.", + "eventPersonalRecord": "Личный рекорд", + "eventPersonalRecordDesc": "Отправляется, когда измерение превосходит ваш прежний лучший результат.", + "eventMoodReminder": "Напоминание о настроении", + "eventMoodReminderDesc": "Ежедневное напоминание отметить текущее настроение.", + "eventCyclePeriodSoon": "Скоро менструация", + "eventCyclePeriodSoonDesc": "Отправляется за пару дней до прогнозируемой следующей менструации.", + "eventCyclePeriodConfirm": "Началась ли менструация?", + "eventCyclePeriodConfirmDesc": "Мягкая проверка в день прогнозируемого начала или позже, пока менструация не отмечена.", + "eventCycleFertileSoon": "Скоро фертильное окно", + "eventCycleFertileSoonDesc": "Отправляется за несколько дней до предполагаемого фертильного окна, если ваша цель — зачатие.", + "eventMedicationLowStock": "Низкий запас лекарства", + "eventMedicationLowStockDesc": "Когда запас отслеживаемого лекарства хватает меньше чем на ваш порог низкого запаса", + "eventCoachNudge": "Напоминание Coach", + "eventCoachNudgeDesc": "Время от времени Coach обращается, когда ваши недавние тенденции требуют проверки.", + "eventMeasurementReminder": "Напоминание об измерении", + "eventMeasurementReminderDesc": "Отправляется, когда подходит срок отслеживаемого измерения.", + "eventMedicationIntakeSync": "Синхронизация приёма лекарств", + "eventMedicationIntakeSyncDesc": "Обновление между устройствами, когда доза отмечена, принята или пропущена.", + "eventDailyBriefing": "Ежедневная сводка", + "eventDailyBriefingDesc": "Одна спокойная утренняя сводка о вашем дне. Выключено, пока вы не включите её.", + "eventSecurityAlert": "Новый вход", + "eventSecurityAlertDesc": "Отправляется, когда аккаунт используется на устройстве или из места, которых мы раньше не видели.", + "eventSharedRecordIntake": "Кто-то, с кем вы поделились записью, отмечает дозу", + "eventSharedRecordIntakeDesc": "Отправляется, только когда это делает другой человек, никогда для ваших собственных записей.", + "security": { + "newDeviceTitle": "Новый вход в ваш аккаунт", + "newDeviceBody": "Новый вход с {device} ({location}). Если это были не вы, немедленно смените пароль.", + "unknownLocation": "неизвестное местоположение" + }, + "sharedRecordIntake": { + "title": "{name} отметил(а) дозу", + "bodyTaken": "{medication}: отмечено как принятое пользователем {name}.", + "bodySkipped": "{medication}: отмечено как пропущенное пользователем {name}." + }, + "loginRequired": "Войдите, чтобы управлять уведомлениями.", + "someChannelsGloballyDisabled": "Один или несколько каналов выключены в настройках и не будут получать уведомления.", + "reminderSettingsLink": "Настройки напоминаний", + "channelsLink": "Каналы", + "handover": { + "claimedTitle": "У {name} теперь свой аккаунт", + "claimedEnd": "{name} принял(а) свою медицинскую запись. Ваш доступ завершён.", + "claimedRead": "{name} принял(а) свою медицинскую запись. Вы по-прежнему можете её просматривать, но больше не можете изменять.", + "claimedManage": "{name} принял(а) свою медицинскую запись. Вы по-прежнему можете ею управлять, пока он(а) не решит иначе.", + "changedTitle": "{name} изменил(а) ваш доступ", + "changedEnd": "Ваш доступ к медицинской записи {name} завершён.", + "changedRead": "Теперь вы можете просматривать медицинскую запись {name}, но не изменять её.", + "changedManage": "Вы можете управлять медицинской записью {name}.", + "unnamed": { + "claimedTitle": "У человека, за которым вы присматривали, теперь свой аккаунт", + "claimedEnd": "Человек, за которым вы присматривали, принял свою медицинскую запись. Ваш доступ завершён.", + "claimedRead": "Человек, за которым вы присматривали, принял свою медицинскую запись. Вы по-прежнему можете её просматривать, но больше не можете изменять.", + "claimedManage": "Человек, за которым вы присматривали, принял свою медицинскую запись. Вы по-прежнему можете ею управлять, пока он(а) не решит иначе.", + "changedTitle": "Ваш доступ к медицинской записи изменился", + "changedEnd": "Ваш доступ к медицинской записи человека, за которым вы присматривали, завершён.", + "changedRead": "Теперь вы можете просматривать медицинскую запись человека, за которым вы присматривали, но не изменять её.", + "changedManage": "Вы можете управлять медицинской записью человека, за которым вы присматривали." + } + }, + "links": { + "open": "Открыть в HealthLog" + }, + "quickActions": { + "moodGood": "Хорошо", + "moodOkay": "Нормально", + "moodBad": "Плохо" + }, + "content": { + "title": "Показатели здоровья в уведомлениях", + "description": "Может ли уведомление показывать значения, например вашу утреннюю оценку.", + "detail": "Выключено: уведомление говорит только, о чём оно, поэтому на экране блокировки нет показателей здоровья. Включено: оно добавляет значения, например утреннюю оценку в сводке. Нажатие на уведомление в любом случае открывает нужное место в приложении.", + "toggleAria": "Показывать показатели здоровья в уведомлениях", + "statusDetailed": "Значения показаны", + "statusGeneric": "Без значений", + "detailedToast": "Уведомления теперь включают показатели здоровья.", + "genericToast": "Уведомления больше не включают показатели здоровья.", + "saveError": "Не удалось сохранить. Попробуйте позже." + }, + "checkupReminders": { + "title": "Напоминания о проверках", + "description": "Включайте и выключайте отдельные напоминания о проверках." + }, + "eventBackupHealth": "Состояние резервных копий", + "eventBackupHealthDesc": "Когда резервная копия останавливается, отстаёт или восстанавливается. Отправляется только администраторам.", + "recoveryReadiness": { + "titleAttention": "Резервные копии требуют внимания", + "titleFailing": "Резервные копии под угрозой", + "titleReminder": "Резервные копии по-прежнему под угрозой", + "titleRecovered": "Резервные копии снова в норме" + }, + "systemJobAlert": { + "titleFailing": "Сбой фонового задания: {queue}", + "titleReminder": "Фоновое задание по-прежнему сбоит: {queue}", + "titleRecovered": "Фоновое задание снова работает: {queue}", + "bodyFailing": "Фоновое задание {queue} сбоило {failures} раз подряд и указано на странице состояния администратора. Последняя ошибка: {error}", + "bodyRecovered": "Фоновое задание {queue} снова выполнилось успешно." + } + }, + "i18n": { + "maintainershipBanner": { + "notice": "Этот язык переведён машинно, включая критичные для безопасности инструкции Coach. Автоматическая проверка расхождений выполняется в CI; сообщайте о любых регрессиях Coach на GitHub.", + "cta": "Сообщить на GitHub", + "dismiss": "Закрыть" + } + }, + "targets": { + "bmi": "ИМТ", + "average30d": "Среднее за 30 дней:", + "consistency": { + "ariaLabel": "Последние 7 дней, статус в диапазоне по дням", + "daysInRange": "{count} из {total} в диапазоне", + "daysLogged": "{count} из {total} записано", + "dotInRange": "в диапазоне", + "dotNearRange": "около диапазона", + "dotOutOfRange": "вне диапазона", + "dotNotLogged": "не записано", + "relativeDay": { + "today": "сегодня", + "yesterday": "вчера", + "twoDaysAgo": "2 дня назад", + "threeDaysAgo": "3 дня назад", + "fourDaysAgo": "4 дня назад", + "fiveDaysAgo": "5 дней назад", + "sixDaysAgo": "6 дней назад" + } + }, + "edit": { + "title": "Изменить целевой диапазон: {metric}", + "description": "Настройте полосу в диапазоне, используемую в графиках, аналитике и отчёте для врача. Значения в {unit}.", + "derivedHint": "Эта карточка вычисляется из других показателей. Изменяйте исходные цели (например, АД или вес).", + "minLabel": "Мин", + "maxLabel": "Макс", + "systolicMin": "Систолическое мин", + "systolicMax": "Систолическое макс", + "diastolicMin": "Диастолическое мин", + "diastolicMax": "Диастолическое макс", + "boundsHint": "Допустимый диапазон: {min}–{max} {unit}", + "resetToDefault": "Сбросить к значению по умолчанию", + "resetTitle": "Сбросить эту цель?", + "resetBody": "Диапазон вернётся к значению по умолчанию. Заданные вами значения больше нигде не хранятся, и вернуть их нельзя.", + "resetBodyBp": "И систолический, и диастолический диапазоны вернутся к значениям по умолчанию. Заданные вами значения больше нигде не хранятся, и вернуть их нельзя.", + "resetConfirm": "Сбросить цель", + "saveSuccess": "Целевой диапазон обновлён", + "saveError": "Не удалось сохранить целевой диапазон", + "resetSuccess": "Целевой диапазон сброшен к значению по умолчанию", + "validationOrder": "Минимум должен быть меньше максимума.", + "validationBounds": "Введите значения в пределах допустимого диапазона, указанного ниже." + }, + "currentValue": "Сейчас: {value} {unit}", + "targetRangeValue": "Цель: {min}–{max} {unit}", + "sourceLabel": "Источник: {source}", + "sourceNames": { + "moodEntries": "Записи настроения", + "sevenDays": "7 дней" + }, + "inTarget": "В пределах целевого диапазона", + "aboveTarget": "{delta} {unit} выше цели", + "belowTarget": "{delta} {unit} ниже цели", + "systolic": "Систолическое", + "diastolic": "Диастолическое", + "glucoseFasting": "Глюкоза (натощак)", + "glucosePostprandial": "Глюкоза (после еды)", + "glucoseRandom": "Глюкоза (случайная)", + "glucoseBedtime": "Глюкоза (перед сном)", + "glucoseUnspecified": "Глюкоза (без метки)", + "status": { + "underweight": "Недостаточный вес", + "normal": "Норма", + "overweight": "Избыточный вес", + "obesityGrade1": "Ожирение I степени", + "obesityGrade2": "Ожирение II степени", + "obesityGrade3": "Ожирение III степени", + "optimal": "Оптимальное", + "highNormal": "Высокое нормальное", + "hypertensionGrade1": "Артериальная гипертензия 1 степени", + "hypertensionGrade2": "Артериальная гипертензия 2 степени", + "hypertensionGrade3": "Артериальная гипертензия 3 степени", + "belowTypicalRange": "Ниже типичного диапазона", + "elevated": "Повышено", + "aboveTypicalRange": "Выше типичного диапазона", + "significantlyLow": "Значительно низкий", + "slightlyLow": "Слегка низкий", + "onTarget": "В цели", + "slightlyElevated": "Слегка повышен", + "significantlyElevated": "Значительно повышен", + "farTooShort": "Слишком короткий", + "tooShort": "Слишком короткий", + "slightlyLong": "Слегка длинный", + "farTooLong": "Слишком длинный", + "belowEssential": "Ниже необходимого", + "essential": "Необходимый", + "athletic": "Спортивный", + "fitness": "Фитнес", + "acceptable": "Приемлемый", + "obese": "Ожирение", + "veryLow": "Очень низкая", + "lowActive": "Низкая активность", + "moderatelyActive": "Умеренная активность", + "active": "Активно", + "veryActive": "Очень активно", + "good": "Хорошо", + "moderate": "Умеренно", + "low": "Низкий", + "high": "Высокий", + "veryGood": "Очень хорошо", + "veryStable": "Очень стабильно", + "stable": "Стабильно", + "fluctuating": "Колеблется" + } + }, + "passwordStrength": { + "veryWeak": "Очень слабый", + "weak": "Слабый", + "acceptable": "Приемлемый", + "strong": "Надёжный", + "veryStrong": "Очень надёжный", + "tooShort": "Слишком короткий", + "characters": "символов", + "minLength": "Требуется не менее {count} символов." + }, + "telegram": { + "errorInvalidAction": "Неверное действие.", + "errorMedicationNotFound": "Лекарство не найдено.", + "errorMedicationInactive": "Лекарство не найдено или неактивно.", + "errorUnknownAction": "Неизвестное действие.", + "snoozeOneHour": "1 час", + "snoozeThreeHours": "3 часа", + "snoozedFor": "{name} отложено на {duration}.", + "skipped": "{name} пропущено.", + "alreadyRecorded": "{name} уже записано.", + "recordedAsTaken": "{name} записано как принятое.", + "confirmed": "{name} подтверждено.", + "genericConfirmed": "Подтверждено.", + "cancelled": "Отменено.", + "moodLogged": "Записано: {score}/5", + "moodNotePrompt": "Добавьте короткую заметку (необязательно).", + "moodNoteSaved": "Заметка сохранена.", + "moodNoteExpired": "Срок этого запроса истёк.", + "remindLater": "Напоминание отложено на {duration}.", + "measurementDone": "Отмечено как выполнено.", + "measurementNotFound": "Напоминание не найдено.", + "buttonMoodNote": "Заметка…", + "buttonLater": "Позже", + "buttonDone": "Готово", + "noActiveMedications": "Активных лекарств не найдено.", + "whichMedication": "Какое лекарство вы приняли?", + "cancelButton": "Отмена", + "askMedicationName": "Укажите лекарство, например taken Ramipril.", + "medicationNotFoundExact": "Лекарство не найдено. Отправьте название точно так, как в HealthLog.", + "helpHeader": "Доступные команды:", + "helpBody": "/help: показать эту справку\n/add: записать приём\n/start: запустить бота\n\nТекстовые команды:\ntaken <name>: подтвердить приём\n\nКнопки в напоминаниях:\n• Taken: подтвердить приём\n• 🕐 1h / 🕐 3h: отложить напоминание\n• ⏭ Skip: пропустить приём\n• ✓ Confirm: подтвердить пропущенный приём", + "measureValuePrompt": "Ответьте значением, чтобы записать его (необязательно).", + "buttonMeasureValue": "Значение…", + "measureValueSaved": "Измерение сохранено.", + "measureValueInvalid": "Ответьте числом, чтобы записать измерение.", + "measureValueOutOfRange": "Это значение вне правдоподобного диапазона.", + "measureValueExpired": "Срок этого запроса истёк." + }, + "medicationReminders": { + "phaseGreenTitle": "🟢 Напоминание: {medName}", + "phaseGreenMessage": "🟢 Напоминание:\n{medName} ({doseInfo}, {timeWindow})\nОкно закроется через {minutes} мин.", + "phaseYellowTitle": "🟡 Скоро срок: {medName}", + "phaseYellowMessage": "🟡 Скоро срок:\n{medName} ({doseInfo}, {timeWindow})\nОсталось {minutes} мин.", + "phaseOrangeTitle": "🟠 Просрочено: {medName}", + "phaseOrangeMessage": "🟠 Просрочено:\n{medName} ({doseInfo}, {timeWindow})\nПросрочено на {minutes} мин.", + "phaseRedTitle": "🔴 Пропущено: {medName}", + "phaseRedMessage": "🔴 Пропущено:\n{medName} ({doseInfo}, {timeWindow})\nОтмечено как пропущенное.", + "buttonTaken": "Принято", + "buttonConfirm": "✓ Подтвердить", + "buttonSnoozeOneHour": "🕐 1 ч", + "buttonSnoozeThreeHours": "🕐 3 ч", + "buttonSkip": "⏭ Пропустить" + }, + "lowStockReminders": { + "title": "Мало запаса: {medName}", + "bodyToday": "{medName}: осталось {units} единиц, меньше чем на день.", + "bodyReorder": "{medName}: осталось {units} единиц. Запас закончится примерно {runsOutOn}. Закажите до {reorderBy}.", + "bodyLastDose": "{medName}: осталось {units} единиц, примерно на последнюю дозу. Запас закончится примерно {runsOutOn}.", + "bodyExpired": "{medName}: пригодного запаса не осталось. {units} единиц помечены как просроченные.", + "bodyAsNeeded": "{medName}: осталось всего {units} единиц. Закажите до того, как понадобится следующая доза." + }, + "moodReminders": { + "dailyTitle": "Отметьте настроение", + "dailyBody": "Как вы себя чувствуете сегодня?" + }, + "coachNudges": { + "greetingMorning": "Доброе утро", + "greetingMorningNamed": "Доброе утро, {name}", + "greetingHey": "Привет", + "greetingHeyNamed": "Привет, {name}", + "complianceBody": "На этой неделе режим приёма лекарств немного сбился. Если хотите, посмотрим, что помогло бы его легче соблюдать.", + "bpBody": "На этой неделе ваше АД держится чуть выше обычного диапазона. Когда будете готовы, я с удовольствием посмотрю его вместе с вами.", + "scoreBody": "За последние дни ваше восстановление постепенно снижается. Если интересно, что за этим стоит, я здесь, чтобы это обсудить.", + "selfContextBody": "Прошло немало времени с тех пор, как обновлялось ваше самоописание. Когда будет минутка, его обновление поможет мне лучше вас понимать.", + "weightBody": "В последнее время ваш вес немного отклонился от целевого диапазона. Если хотите, спокойно оценим ситуацию вместе.", + "sleepDebtBody": "Несколько ночей на этой неделе были короткими. Если хотите, поищем закономерность вместе.", + "measurementGapBody": "Ваш журнал молчит уже около недели. Когда будет удобно, быстрая отметка поможет снова войти в ритм.", + "focusNote": "Это также связано с тем, за чем вы хотели следить.", + "reminderSurfacedTitle": "Напоминание, которое вы просили", + "reminderSurfacedLeadOne": "Вы просили напомнить вам сегодня об этом:", + "reminderSurfacedLeadMany": "Вы просили напомнить вам сегодня о {count} вещах:", + "questionConditions": "Есть ли у вас хронические заболевания, о которых Coach стоит знать?", + "questionFocus": "Есть ли что-то конкретное, на что Coach должен обращать внимание?", + "questionAllergies": "Есть ли у вас аллергии или непереносимость?", + "questionAboutMe": "Хотите рассказать Coach немного о себе: режиме, целях, контексте?" + }, + "clinicianView": { + "title": "Общая медицинская запись", + "period": "Отчётный период: {start}–{end}", + "expires": "Срок действия этой ссылки истекает {date}.", + "provenance": "Это сводка только для чтения, которой поделился её владелец, экспортированная из его самостоятельно отслеживаемых данных HealthLog. Значения записаны самостоятельно и могут включать измерения, синхронизированные с устройств; считайте их сообщёнными пациентом, а не клиническим обследованием.", + "labs": "Лабораторные показатели", + "medications": "Лекарства и приверженность", + "bmi": "Индекс массы тела (ИМТ)", + "statSummary": "последнее {latest} (среднее {avg}, диапазон {min}–{max})", + "statSummaryWithUnit": "последнее {latest} {unit} (среднее {avg} {unit}, диапазон {min}–{max} {unit})", + "adherence": "Приверженность {rate}", + "noAdherence": "—", + "glucose": { + "FASTING": "Глюкоза (натощак)", + "POSTPRANDIAL": "Глюкоза (после еды)", + "RANDOM": "Глюкоза (случайная)", + "BEDTIME": "Глюкоза (перед сном)" + }, + "wellness": { + "title": "Оценки самочувствия", + "disclaimer": "Описательные баллы (0–100), вычисленные по отслеживаемым сигналам. Это не клиническая оценка и не диагноз.", + "recovery": "Балл восстановления", + "stress": "Балл стресса", + "strain": "Балл напряжения", + "score": "Балл самочувствия" + }, + "footer": "Предоставлено из HealthLog, самостоятельно размещаемого личного дневника здоровья.", + "unlock": { + "title": "Введите парольную фразу", + "description": "Эта общая медицинская запись защищена. Введите выданную вам парольную фразу, чтобы просмотреть её.", + "label": "Парольная фраза", + "error": "Эта парольная фраза неверна.", + "submit": "Разблокировать" + }, + "loadError": { + "title": "Не удалось загрузить этот общий просмотр", + "description": "При открытии этой общей медицинской записи что-то пошло не так. Возможно, срок действия ссылки истёк или произошёл временный сбой. Попробуйте ещё раз или попросите у поделившегося новой ссылки.", + "retry": "Попробовать ещё раз" + }, + "documents": { + "title": "Документы", + "untitled": "Документ без названия", + "download": "Скачать", + "attachmentHint": "Этот файл скачивается на ваше устройство (без предпросмотра на странице).", + "exifNote": "Метаданные камеры (EXIF/GPS) удалены из общих изображений JPEG, PNG и WebP." + }, + "downloadPdf": "Скачать как PDF", + "downloadFhir": "Скачать как FHIR", + "bmiSection": "Индекс массы тела", + "sectionEmpty": "Включено в эту ссылку, но здесь ничего не записано.", + "sectionUnavailable": "Включено в эту ссылку, но эта часть записи выключена в аккаунте, из которого она берётся, поэтому данных нет.", + "lastInjection": "Последняя инъекция", + "identity": { + "name": "Имя" + }, + "doses": { + "title": "Записанные дозы", + "showing": "Показаны последние {shown} из {total} записанных доз." + }, + "course": "Курс {n}", + "courseRange": "с {start} по {end}", + "courseSince": "с {start}", + "unavailable": { + "title": "Ссылка истекла или недействительна", + "description": "Срок действия этой ссылки для общего доступа истёк, она отозвана или неполна. Попросите у поделившегося новой ссылки." + } + }, + "cycle": { + "symptomCategory": { + "physical": "Физические", + "emotional": "Эмоциональные", + "digestive": "Пищеварительные", + "custom": "Свои" + }, + "symptom": { + "cramps": "Спазмы", + "headache": "Головная боль", + "bloating": "Вздутие", + "acne": "Акне", + "breastTenderness": "Болезненность груди", + "fatigue": "Усталость", + "backPain": "Боль в спине", + "insomnia": "Бессонница", + "libidoHigh": "Повышенное либидо", + "libidoLow": "Пониженное либидо", + "moodSwings": "Перепады настроения", + "foodCravings": "Тяга к еде", + "nausea": "Тошнота", + "diarrhea": "Диарея", + "constipation": "Запор", + "custom": { + "add": "Добавить симптом", + "label": "Название", + "labelPlaceholder": "например, Головокружение", + "icon": "Значок", + "limitReached": "Достигнут предел своих симптомов.", + "remove": "Убрать {label}", + "removeTitle": "Убрать этот симптом?", + "removeBody": "«{label}» исчезнет из списка симптомов. Дни, где он уже отмечен, сохранят его, но выбрать его снова будет нельзя.", + "removeConfirm": "Убрать", + "fallbackLabel": "Свой симптом" + } + }, + "prediction": { + "disclaimer": "Прогнозы — это оценки по вашим записанным данным, а не медицинская рекомендация и не контрацепция. Точность растёт по мере того, как вы записываете больше циклов." + }, + "insights": { + "headline": { + "title": "Ваш цикл и ваше тело", + "restingHeartRate": "В лютеиновой фазе ваша ЧСС в покое примерно на {delta} {dir}, чем в фолликулярной.", + "heartRateVariability": "В лютеиновой фазе ваша вариабельность сердечного ритма примерно на {delta} {dir}, чем в фолликулярной.", + "generic": "В лютеиновой фазе ваш показатель {metric} примерно на {delta} {dir}, чем в фолликулярной.", + "dirHigher": "выше", + "dirLower": "ниже", + "empty": "Пока недостаточно циклов и измерений, чтобы выявить закономерность по фазам. Продолжайте записывать; это заполнится по мере роста истории." + }, + "crosstab": { + "description": "Как каждое измерение соотносится между лютеиновой и фолликулярной фазами на ваших собственных данных.", + "pairLabel": "{metric}: лютеиновая против фолликулярной", + "detail": "Лютеиновая {lutealAvg} ({lutealDays} дней) против фолликулярной {follicularAvg} ({follicularDays} дней).", + "metricRestingHeartRate": "ЧСС в покое", + "metricHrv": "Вариабельность сердечного ритма", + "metricSleepDuration": "Длительность сна", + "metricSteps": "Шаги", + "metricWeight": "Вес", + "metricBasalBodyTemp": "Базальная температура тела", + "metricWristTemperature": "Ночная температура запястья", + "metricSkinTemperature": "Температура кожи", + "metricBloodGlucose": "Глюкоза крови", + "metricMood": "Настроение" + }, + "title": "Аналитика цикла", + "symptomPatternsTitle": "Закономерности симптомов по фазам", + "symptomPatternsEmpty": "Записывайте симптомы в течение цикла, чтобы увидеть, в какой фазе они группируются.", + "symptomMostlyIn": "В основном в фазе {phase} ({count}/{total} дней)" + }, + "phaseEducation": { + "title": "Что происходит сейчас", + "whatsHappening": { + "MENSTRUAL": "Менструация — начало нового цикла, когда отслаивается слизистая матки. В эти первые дни энергия и настроение часто ниже.", + "FOLLICULAR": "После менструации эстроген постепенно растёт, пока тело готовит яйцеклетку. Многие замечают более ровную энергию в этот период.", + "OVULATORY": "Примерно в середине цикла выходит яйцеклетка, и на короткое окно фертильность достигает пика. Эта фаза — самая короткая из четырёх.", + "LUTEAL": "После овуляции растёт прогестерон, и тело успокаивается. В дни перед следующей менструацией некоторые замечают предменструальные изменения." + }, + "context": { + "MENSTRUAL": "Уровень гормонов самый низкий, поэтому эти дни могут ощущаться как тихая перезагрузка. Некоторые замечают спазмы, более лёгкий сон или желание замедлиться; другие проходят через это почти без изменений. Всё это в пределах нормы, и ощущения могут меняться от цикла к циклу.", + "FOLLICULAR": "С ростом эстрогена многие описывают эти дни как светлые и открытые: сон часто приходит легче, а ум кажется яснее. Базальная температура тела обычно остаётся в нижней полосе до самого начала овуляции. Длительность этой фазы сильнее всего различается у разных людей и от цикла к циклу.", + "OVULATORY": "Эстроген достигает пика незадолго до выхода яйцеклетки, часто вместе с кратким подъёмом настроения и небольшим ростом базальной температуры тела в следующие день-два. Цервикальная жидкость в это окно обычно становится прозрачнее и более тянущейся. Короткое покалывание с одной стороны замечают некоторые; многие не чувствуют ничего, и то и другое совершенно нормально.", + "LUTEAL": "Прогестерон ведёт вторую половину, и базальная температура тела обычно устанавливается чуть выше, чем ранее в цикле. Некоторые замечают изменения сна, аппетита, настроения или энергии по мере течения дней, другие чувствуют себя ровно всё время. Закономерность индивидуальна и часто выглядит по-разному от месяца к месяцу." + }, + "commonHere": "Вы часто замечаете это здесь", + "stillLearning": "Ещё изучаем ваш цикл. Продолжайте записывать, и это заполнится закономерностями из ваших собственных дней." + }, + "insightsSummary": { + "title": "Ваш цикл", + "currentDay": "День {day} вашего цикла", + "noActiveCycle": "Активного цикла пока нет", + "viewDetails": "Открыть аналитику цикла" + }, + "wellnessRing": { + "label": "Цикл", + "loadError": "Не удалось загрузить ваш цикл." + }, + "disclaimer": "Эти прогнозы — описательные оценки по вашим записанным данным, а не метод контрацепции и не медицинская рекомендация. Они никогда не означают, что незащищённый секс безопасен. По вопросам контрацепции или любого медицинского решения обратитесь к специалисту здравоохранения.", + "title": "Ваш цикл", + "subtitle": "Записывайте менструацию и симптомы, смотрите, что будет дальше.", + "tabs": { + "calendar": "Календарь", + "predictions": "Прогнозы", + "insights": "Аналитика", + "settings": "Настройки" + }, + "logToday": "Записать сегодня", + "startedPeriod": "У меня началась менструация сегодня", + "endedPeriod": "У меня закончилась менструация сегодня", + "phase": { + "MENSTRUAL": "Менструальная", + "FOLLICULAR": "Фолликулярная", + "OVULATORY": "Овуляторная", + "LUTEAL": "Лютеиновая", + "none": "Нет фазы", + "label": "Фаза" + }, + "flow": { + "NONE": "Нет", + "SPOTTING": "Мажущие", + "LIGHT": "Слабые", + "MEDIUM": "Умеренные", + "HEAVY": "Обильные", + "label": "Выделения" + }, + "ovulationTest": { + "NEGATIVE": "Отрицательный", + "POSITIVE_LH_SURGE": "Пик ЛГ", + "ESTROGEN_SURGE": "Пик эстрогена", + "INDETERMINATE": "Неопределённый", + "label": "Тест на овуляцию" + }, + "mucus": { + "DRY": "Сухая", + "STICKY": "Липкая", + "CREAMY": "Сливочная", + "WATERY": "Водянистая", + "EGG_WHITE": "Как яичный белок", + "label": "Цервикальная слизь" + }, + "cervixPosition": { + "LOW": "Низко", + "HIGH": "Высоко" + }, + "cervixFirmness": { + "FIRM": "Плотная", + "SOFT": "Мягкая" + }, + "cervixOpening": { + "CLOSED": "Закрыта", + "OPEN": "Открыта" + }, + "goal": { + "GENERAL_HEALTH": "Общее здоровье", + "AVOID_PREGNANCY": "Избегание беременности", + "TRYING_TO_CONCEIVE": "Планирование беременности", + "PERIMENOPAUSE": "Перименопауза", + "OFF": "Отслеживание выключено", + "label": "Для чего вы отслеживаете?", + "description": "Это определяет формулировки и то, какие прогнозы вы видите. Подсказки о фертильном окне показываются, только если вы планируете беременность." + }, + "ring": { + "dayOfCycle": "День {day}", + "dayUnknown": "—", + "ariaPhase": "День цикла {day}, фаза {phase}", + "ariaUnknown": "Активного цикла пока нет", + "caption": "вашего цикла", + "firstPeriodCta": "Записать первую менструацию", + "periodOverdue": "Ваша менструация запаздывает. Счёт дней приостановлен, пока не будет записана следующая менструация.", + "periodOverdueDays": "Ваша менструация запаздывает на {days} дней. Счёт дней приостановлен, пока не будет записана следующая менструация.", + "logPeriodCta": "Записать менструацию" + }, + "calendar": { + "legendPeriod": "Записанная менструация", + "legendPredicted": "Прогнозируемая менструация", + "legendFertile": "Фертильное окно", + "legendOvulation": "Овуляция", + "legendSymptoms": "Записанные симптомы", + "prevMonth": "Предыдущий месяц", + "nextMonth": "Следующий месяц", + "loading": "Загрузка календаря…", + "learning": "Изучаем ваш цикл. Запишите хотя бы три полных цикла, и фертильное окно, овуляция и фазы заполнятся. До тех пор календарь показывает только то, что вы записали.", + "legendSymptom": "Симптомы", + "legendOvulationConfirmed": "Подтверждённая овуляция", + "flowSpotting": "мажущие", + "flowLight": "слабые", + "flowMedium": "умеренные", + "flowHeavy": "обильные", + "legendIntercourse": "Половой акт", + "legendOtherEntries": "Другие записи" + }, + "predictions": { + "title": "Что будет дальше", + "nextPeriod": "Следующая менструация", + "nextPeriodWindow": "{low}–{high}", + "fertileWindow": "Фертильное окно", + "ovulation": "Предполагаемая овуляция", + "confidenceHigh": "Высокая", + "confidenceMedium": "Средняя", + "confidenceLow": "Низкая", + "stillLearning": "Ещё изучаем", + "stillLearningBody": "Запишите хотя бы три полных цикла, и прогнозы станут точнее. До тех пор это грубая оценка.", + "rawMode": "Прогноз выключен", + "rawModeBody": "Вы выключили прогнозы. Показаны только ваши записанные данные, без прогноза.", + "none": "Прогноза пока нет. Запишите менструацию, чтобы начать.", + "ovulationConfirmed": "Овуляция (подтверждена)" + }, + "history": { + "title": "Ваши циклы", + "avgLength": "Средняя длительность", + "variability": "Вариабельность", + "avgPeriodLength": "Средняя менструация", + "regularity": "Регулярность", + "regularityREGULAR": "Регулярный", + "regularityIRREGULAR": "Нерегулярный", + "regularityLEARNING": "Изучаем", + "days": "{count} дней", + "daysPlusMinus": "± {count} дней", + "none": "Циклы пока не записаны.", + "recentCycles": "Последние циклы", + "ongoing": "идёт", + "periodDays": "менструация {count} дн.", + "ovulationChip": "Овуляция", + "chartTitle": "Длительность цикла в динамике", + "chartCaption": "Каждый столбец — один цикл: розовое основание — ваша менструация, остальное — длительность цикла.", + "chartAria": "График длительности последних {count} циклов, в среднем {avg} дней, классифицируется как {regularity}.", + "legendPeriodSegment": "Дни менструации", + "legendRestSegment": "Остальная часть цикла" + }, + "sheet": { + "title": "Записать день", + "description": "Выделения, симптомы и заметки за этот день.", + "flow": "Выделения", + "symptoms": "Симптомы", + "temperature": "Базальная температура тела", + "temperatureDisturbed": "Отметить измерение как искажённое", + "temperatureDisturbedHint": "Жар, заболевание, алкоголь или позднее измерение: исключается из оценки температуры.", + "ovulationTest": "Тест на овуляцию", + "mucus": "Цервикальная слизь", + "cervix": "Шейка матки", + "cervixPosition": "Положение", + "cervixFirmness": "Плотность", + "cervixOpening": "Открытие", + "intercourse": "Половой акт", + "protected": "Защищённый", + "intermenstrualBleeding": "Мажущие выделения между менструациями", + "pregnancyTest": "Тест на беременность", + "progesteroneTest": "Тест на прогестерон", + "contraceptive": "Контрацептив", + "severity": "Тяжесть", + "severityLevel": "Тяжесть {level} из 4", + "delete": "Удалить", + "deleteTitle": "Удалить этот день?", + "deleteBody": "Всё, что записано за этот день, исчезнет: выделения, температура, симптомы и ваша заметка. Вернуть это нельзя.", + "deleteConfirm": "Удалить день", + "note": "Заметка", + "notePlaceholder": "Всё, что вы хотите запомнить об этом дне…", + "save": "Сохранить", + "saving": "Сохранение…", + "cancel": "Отмена", + "saveError": "Не удалось сохранить. Попробуйте ещё раз.", + "emptyHint": "Выберите выделения или симптом, чтобы сохранить этот день, или используйте кнопку начала менструации выше.", + "temperatureSection": "Температура и овуляция", + "intimacySection": "Близость и контрацепция", + "testsSection": "Тесты", + "phaseDayHeader": "День {day}, {phase}", + "bbtHint": "Измеряйте сразу утром, до того как встать.", + "titleForDate": "Запись за {date}", + "descriptionToday": "Сегодня. Выделения, симптомы и заметки.", + "deleteBodyCycleStart": "Этот день открывает цикл. Удаление уберёт и начало менструации, поэтому предыдущий цикл продолжится как прежде. Всё, что здесь записано, тоже исчезнет: выделения, температура, симптомы и ваша заметка. Вернуть это нельзя." + }, + "testResult": { + "POSITIVE": "Положительный", + "NEGATIVE": "Отрицательный", + "INDETERMINATE": "Неясный" + }, + "settings": { + "title": "Настройки цикла", + "typicalCycleLength": "Типичная длительность цикла (дней)", + "typicalPeriodLength": "Типичная длительность менструации (дней)", + "lutealPhaseLength": "Длительность лютеиновой фазы (дней)", + "priorsDescription": "Эти исходные значения помогают прогнозам, пока вы не записали много циклов. Оставьте пустым, чтобы использовать значения по умолчанию.", + "rawChartMode": "Режим исходного графика", + "rawChartModeDescription": "Показывать только записанные данные без прогнозов и интерпретации.", + "secondarySymptomLabel": "Вторичный признак фертильности", + "secondarySymptomDescription": "Второй признак в паре с температурой для симптотермальной двойной проверки. Большинство отслеживает цервикальную слизь; переключитесь на наблюдение за шейкой матки, если предпочитаете.", + "secondarySymptomCitation": "Прочитать о методе (исследование)", + "secondarySymptom": { + "MUCUS": "Цервикальная слизь", + "CERVIX": "Наблюдение за шейкой матки" + }, + "prediction": "Прогнозы", + "predictionDescription": "Прогнозировать следующую менструацию и, когда уместно, фертильное окно.", + "encryption": "Шифровать чувствительные записи", + "encryptionDescription": "Шифровать при хранении поля, раскрывающие намерения (тесты на беременность, контрацепция, половой акт), в дополнение к всегда шифруемым заметкам.", + "discreet": "Ненавязчивые уведомления", + "discreetDescription": "Скрывать детали цикла в тексте уведомлений на экране блокировки.", + "saved": "Настройки сохранены", + "saveError": "Не удалось сохранить. Попробуйте ещё раз.", + "save": "Сохранить", + "reminders": "Напоминания", + "remindersDescription": "Включайте напоминания о менструации по каналам в настройках уведомлений.", + "remindersLink": "Настройки уведомлений", + "fertileReminder": "Напоминание о фертильном окне", + "fertileReminderDescription": "Получите предупреждение за несколько дней до предполагаемого фертильного окна. По умолчанию выключено; включайте по каналам в настройках уведомлений." + }, + "contraceptive": { + "NONE": "Нет", + "UNSPECIFIED": "Другое", + "IMPLANT": "Имплант", + "INJECTION": "Инъекция", + "IUD": "ВМС", + "INTRAVAGINAL_RING": "Кольцо", + "ORAL": "Таблетки", + "PATCH": "Пластырь", + "EMERGENCY": "Экстренная" + }, + "loadError": "Не удалось загрузить данные вашего цикла.", + "saveError": "Не удалось сохранить запись цикла.", + "deleteError": "Не удалось удалить запись.", + "bbt": { + "title": "Базальная температура тела", + "caption": "Ваша утренняя температура в этом цикле. Устойчивый подъём примерно на 0,2 °C следует за овуляцией.", + "empty": "Измерений температуры пока нет", + "emptyHint": "Записывайте базальную температуру тела каждое утро, чтобы увидеть температурный сдвиг вашего цикла.", + "ovulationEstimate": "Предпол. овуляция", + "tooltipTemp": "{temp} {unit}", + "ovulationConfirmed": "Подтверждённая овуляция" + }, + "fieldInfo": { + "bbt": "Ваша температура в покое, измеренная сразу утром до того, как встать. После овуляции она слегка повышается (примерно на 0,2–0,3 °C).", + "bbtLabel": "Что такое базальная температура тела?", + "mucus": "Влагалищные выделения меняются в течение цикла: от сухих или липких к сливочным, затем водянистым и похожим на яичный белок в самые фертильные дни.", + "mucusLabel": "Что такое цервикальная слизь?", + "ovulationTest": "Домашний тест мочи, который выявляет пик ЛГ — гормональный всплеск примерно за 24–36 ч до овуляции. Положительный результат отмечает самое фертильное окно.", + "ovulationTestLabel": "Что такое тест на овуляцию?", + "spotting": "Слабые кровянистые выделения вне менструации.", + "spottingLabel": "Что такое мажущие выделения между менструациями?", + "pregnancyTest": "Результат домашнего теста на беременность (ХГЧ).", + "pregnancyTestLabel": "Что такое тест на беременность?", + "progesteroneTest": "Тест, подтверждающий, что овуляция произошла; после неё прогестерон растёт.", + "progesteroneTestLabel": "Что такое тест на прогестерон?", + "intercourse": "Был ли половой акт в этот день.", + "intercourseLabel": "Что отслеживает половой акт?", + "protected": "Использовалась ли контрацепция во время полового акта.", + "protectedLabel": "Что значит «защищённый»?" + }, + "saveSuccess": "Запись сохранена", + "deleteSuccess": "Запись удалена", + "periodStartSaved": "Начало менструации сохранено", + "periodEndSaved": "Конец менструации сохранён", + "startedPeriodOnDate": "У меня началась менструация в этот день", + "endedPeriodOnDate": "У меня закончилась менструация в этот день", + "startAbsorbed": "Начало менструации сохранено. Ваше начало {absorbed} объединено с {date}.", + "startRestored": "Сохранено. Начало {dates} восстановлено." + }, + "cycleReminders": { + "periodSoonTitle": "Скоро вероятная менструация", + "periodSoonBody": "Следующая менструация прогнозируется примерно через два дня.", + "periodConfirmTitle": "Началась ли менструация?", + "periodConfirmBody": "Менструация прогнозировалась примерно сейчас. Запишите её, чтобы прогнозы оставались точными.", + "fertileSoonTitle": "Скоро фертильное окно", + "fertileSoonBody": "Предполагаемое фертильное окно, по прогнозу, начнётся примерно через два дня. Это оценка, а не медицинская или контрацептивная гарантия.", + "discreetTitle": "Напоминание HealthLog", + "discreetBody": "У вас есть напоминание в HealthLog." + }, + "dataList": { + "allSources": "Все источники", + "dateFrom": "С", + "dateTo": "По", + "dateRange": "Диапазон дат", + "valueRange": "Значение", + "valueMin": "Мин", + "valueMax": "Макс", + "typeLabel": "Тип", + "sourceLabel": "Источник", + "resetFilters": "Сбросить", + "clearFilter": "Очистить фильтр: {label}", + "selectAll": "Выбрать все на этой странице", + "selectRow": "Выбрать строку", + "selected": "Выбрано: {count}", + "deleteN": "Удалить ({count})", + "clearSelection": "Снять выделение", + "selectionBarLabel": "Действия с выделением" + }, + "measurementReminders": { + "sectionTitle": "Проверки", + "sectionDescription": "Напоминания о том, что измерить или проверить, когда и где.", + "markDone": "Готово", + "delete": "Удалить", + "deleteConfirmTitle": "Удалить напоминание?", + "deleteConfirmDescription": "Это напоминание о проверке будет удалено навсегда.", + "postpone": { + "menuItem": "Отложить…", + "title": "Отложить срок", + "description": "Сдвигает только текущий срок; регулярный ритм остаётся неизменным.", + "chip": "+{days} дней", + "dateLabel": "Новая дата", + "confirm": "Отложить" + }, + "skip": { + "heading": "Пропустить этот срок", + "explainer": "Честно записывается как пропущенное, а не как выполненное. Интервал начинается заново с сегодняшнего дня.", + "action": "Пропустить", + "confirmTitle": "Пропустить этот срок?" + }, + "snoozedUntil": "Отложено до {date}", + "skippedOn": "Пропущено {date}", + "skipCount": "пропущено {count}×", + "disabledBadge": "Выкл.", + "nextDue": { + "none": "Не запланировано", + "today": "Срок сегодня", + "tomorrow": "Срок завтра", + "inDays": "Через {days} дней" + }, + "overdueByDays": "Просрочено на {days} дней", + "overdueSinceYesterday": "Просрочено со вчера", + "cadence": { + "everyNDays": "Каждые {days} дней", + "custom": "Своё расписание", + "customInterval": "Своё (каждые N дней)", + "rruleOption": "Своё правило (RRULE)" + }, + "location": { + "prefix": "Где: {location}" + }, + "types": { + "WEIGHT": "Вес", + "BLOOD_PRESSURE_SYS": "АД", + "PULSE": "Пульс", + "BLOOD_GLUCOSE": "Глюкоза крови", + "OXYGEN_SATURATION": "Насыщение кислородом", + "BODY_FAT": "Жировая масса", + "BODY_TEMPERATURE": "Температура тела", + "FAT_MASS": "Жировая масса", + "FAT_FREE_MASS": "Обезжиренная масса", + "MUSCLE_MASS": "Мышечная масса", + "LEAN_BODY_MASS": "Тощая масса тела", + "BONE_MASS": "Костная масса", + "TOTAL_BODY_WATER": "Вода в организме", + "VISCERAL_FAT": "Висцеральный жир", + "BODY_MASS_INDEX": "Индекс массы тела (ИМТ)", + "WAIST_CIRCUMFERENCE": "Окружность талии", + "PHQ9_SCORE": "PHQ-9 (настроение)", + "GAD7_SCORE": "GAD-7 (тревога)", + "WHO5_SCORE": "WHO-5 (самочувствие)", + "SCI_SCORE": "SCI (сон)" + }, + "typeGroups": { + "vitals": "Показатели", + "bodyComposition": "Состав тела", + "mentalWellbeing": "Психическое благополучие" + }, + "empty": { + "title": "Напоминаний пока нет", + "description": "Добавьте напоминание измерять АД по расписанию или запланировать ежегодный анализ крови." + }, + "form": { + "label": "Название", + "labelPlaceholder": "например, Измерить АД", + "kind": "Тип", + "kindType": "Связано с измерением", + "kindFreeText": "Проверка свободным текстом", + "measurementType": "Измерение", + "cadence": "Повтор", + "notifyHour": "Напомнить в", + "location": "Где (необязательно)", + "locationPlaceholder": "например, поликлиника, лаборатория", + "save": "Сохранить", + "createTitle": "Новое напоминание", + "editTitle": "Изменить напоминание", + "customInterval": "Повторять каждые (дней)", + "rrule": "Правило повторения (RRULE)", + "rruleHint": "RFC-5545, например FREQ=YEARLY для ежегодной проверки.", + "firstDue": "Первый срок (необязательно)" + }, + "pushTitle": "Напоминание о проверке", + "pushBody": "Пора: {label}", + "pushLocation": "(в {location})", + "edit": "Изменить", + "originCoach": "Тренер", + "until": "До {date}", + "selfPlanned": "Запланировано самостоятельно", + "captureValue": "Записать значение", + "measureNow": "Измерить сейчас", + "startCheckIn": "Начать проверку", + "nextDueLabel": "Следующий срок:", + "lastDoneLabel": "Последний раз:", + "customize": "Настроить проверки", + "adherence": { + "label": "В пределах интервала", + "onTrack": "В графике", + "due": "Срок сейчас" + }, + "capture": { + "title": "Записать измерение", + "description": "Введите измерение; напоминание будет отмечено как выполненное." + }, + "manage": { + "empty": "Пока нет напоминаний для настройки." + }, + "dashboard": { + "empty": "Нет предстоящих напоминаний о проверках.", + "openLink": "Открыть проверки" + }, + "showMeasurements": "Показать измерения", + "loadError": "Не удалось загрузить ваши напоминания.", + "fileVisit": "Записать визит" + }, + "moduleList": { + "viewToggleLabel": "Вид", + "viewCards": "Карточки", + "viewList": "Список", + "viewHeading": "Вид", + "viewDescription": "Выберите, показывать записи карточками или компактным списком.", + "reorder": { + "heading": "Порядок", + "description": "Перетащите записи, чтобы задать порядок их отображения.", + "empty": "Пока нет записей для изменения порядка." + } + }, + "labs": { + "title": "Результаты анализов", + "subtitle": "Анализы крови и показатели", + "addResult": "Добавить значение", + "addDescription": "Запишите показатель из результата анализа.", + "addFirst": "Добавить первый результат", + "emptyTitle": "Результатов анализов пока нет", + "emptyDescription": "Записывайте анализы, такие как HbA1c (гликированный гемоглобин), Холестерин ЛПНП или Ферритин, чтобы отслеживать их в динамике и делиться с врачом.", + "referenceLabel": "Референс", + "readingsCount": "Измерений: {count}", + "deleteConfirmTitle": "Удалить результат анализа?", + "deleteConfirmDescription": "Этот результат анализа будет удалён. В течение короткого времени его можно будет отменить.", + "deletedToast": "Результат удалён", + "deleteError": "Не удалось удалить результат", + "loadError": "Не удалось загрузить результаты анализов", + "customize": "Настроить анализы", + "localOcr": { + "heading": "Распознавать сканы на этом устройстве", + "description": "Распознаёт фото на вашем устройстве и отправляет провайдеру только извлечённый текст.", + "detail": "Полезно, когда ваш ИИ-провайдер не умеет читать изображения. Менее точно: проверяйте каждое значение перед сохранением." + }, + "sort": { + "heading": "Порядок сортировки", + "label": "Порядок значений", + "recentDesc": "Сначала последнее измерение", + "recentAsc": "Сначала самое раннее измерение", + "alphaAsc": "Название (А–Я)", + "alphaDesc": "Название (Я–А)", + "manual": "Сортировать вручную", + "hint": "При ручной сортировке вы можете перетаскивать показатели ниже в свой порядок." + }, + "range": { + "inRange": "В диапазоне", + "below": "Ниже диапазона", + "above": "Выше диапазона" + }, + "form": { + "value": "Значение", + "takenAt": "Дата взятия образца", + "note": "Заметка", + "notePlaceholder": "Необязательный контекст для этого результата", + "requiredError": "Введите значение.", + "save": "Сохранить", + "saveAndAddAnother": "Сохранить и добавить ещё", + "savedToast": "Результат сохранён", + "saveError": "Не удалось сохранить результат", + "biomarker": "Показатель", + "biomarkerPlaceholder": "Выберите показатель", + "defineNew": "+ Определить новый показатель", + "noBiomarkersHint": "Сначала определите показатель, чтобы записать по нему значение.", + "pickBiomarkerError": "Сначала выберите показатель.", + "resultType": "Тип результата", + "numeric": "Числовой", + "qualitative": "Качественный", + "qualitativeResult": "Результат", + "qualitativePlaceholder": "например, отрицательный", + "qualNegative": "отрицательный", + "qualPositive": "положительный", + "qualBorderline": "пограничный", + "sourceRange": "Диапазон, напечатанный в отчёте", + "sourceRangePlaceholder": "например, 3.5 - 5.0 или < 5", + "sourceRangeAdd": "+ Добавить диапазон из отчёта", + "sourceRangeHint": "Необязательно. Применяется только к этому измерению; сохранённый диапазон остаётся прежним.", + "sourceRangeUnparsed": "Сохранено как написано, числовой диапазон из него не извлечён." + }, + "backToLabs": "Назад к результатам анализов", + "hasNote": "Заметка", + "editTitle": "Изменить измерение", + "editDescription": "Исправьте значение, дату или заметку этого измерения.", + "editedToast": "Измерение обновлено", + "editError": "Не удалось обновить измерение", + "editTimestampError": "Введите корректную дату.", + "editReading": "Изменить измерение", + "deleteReading": "Удалить измерение", + "restoredToast": "Измерение восстановлено", + "restoreError": "Не удалось восстановить измерение", + "detail": { + "emptyTitle": "Измерений пока нет", + "emptyDescription": "Добавьте значение, чтобы начать отслеживать этот показатель в динамике.", + "title": "Показатель", + "genericDescription": "Лабораторный показатель, который вы отслеживаете. Добавляйте измерения, чтобы следить за его динамикой относительно референсного диапазона.", + "valuesTitle": "{marker}: все измерения", + "valuesDescription": "Все измерения этого показателя. Изменяйте или удаляйте запись напрямую.", + "backToMarker": "Назад к {marker}", + "latestResult": "Последний результат" + }, + "chart": { + "empty": "В этом периоде нет измерений.", + "valueLabel": "Значение", + "range": { + "30": "30д", + "90": "90д", + "365": "1г", + "all": "Все" + }, + "sourceRangeLabel": "Диапазон из отчёта", + "sourceBandLegend": "Вторая полоса: диапазон, напечатанный в отчёте от {date}.", + "sourceBandMixed": "Вторая полоса: диапазон, напечатанный в последнем отчёте. Более ранние отчёты в поле зрения указывают другие диапазоны." + }, + "biomarker": { + "manageTitle": "Показатели", + "managerDescription": "Определите показатель один раз; его единица и диапазон используются для каждого измерения.", + "define": "Определить", + "defineFirst": "Определить первый показатель", + "defineTitle": "Определить показатель", + "defineDescription": "Задайте название, единицу и референсный диапазон один раз. Показатель выбирается при добавлении значения.", + "editTitle": "Изменить показатель", + "edit": "Изменить", + "delete": "Удалить", + "deletedToast": "Показатель удалён", + "deleteError": "Не удалось удалить показатель", + "deleteConfirmTitle": "Удалить показатель?", + "deleteConfirmDescription": "Показатель и все его записанные значения будут удалены безвозвратно. Отменить это нельзя.", + "emptyTitle": "Показателей пока нет", + "emptyDescription": "Определите показатели, например Холестерин ЛПНП или HbA1c (гликированный гемоглобин), чтобы записывать по ним значения.", + "loadError": "Не удалось загрузить показатели", + "noRange": "Без референсного диапазона", + "form": { + "seedLabel": "Начать с частого показателя", + "seedPlaceholder": "Выберите показатель (необязательно)", + "seedHint": "Выбор заполнит поля ниже. Скорректируйте диапазон под свою лабораторию.", + "name": "Название", + "namePlaceholder": "например Холестерин ЛПНП", + "unit": "Единица", + "unitPlaceholder": "например мг/дл", + "unitLockedHint": "Когда у показателя есть измерения, его единица остаётся прежней. Иначе сохранённые значения показывались бы в новой единице без пересчёта.", + "panel": "Панель", + "panelPlaceholder": "например Липиды", + "lowerBound": "Нижняя граница", + "upperBound": "Верхняя граница", + "lowerPlaceholder": "Нижняя граница", + "upperPlaceholder": "Верхняя граница", + "context": "Контекст", + "contextPlaceholder": "Необязательная заметка об этом показателе", + "rangeHint": "Любая из границ необязательна. Оставьте одну пустой для открытого диапазона (например Холестерин ЛПНП < 116).", + "requiredError": "Название и единица обязательны.", + "rangeOrderError": "Нижняя граница не должна превышать верхнюю.", + "save": "Сохранить показатель", + "savedToast": "Показатель сохранён", + "updatedToast": "Показатель обновлён", + "saveError": "Не удалось сохранить показатель" + }, + "hide": "Скрыть", + "unhide": "Восстановить", + "hiddenToast": "Показатель скрыт", + "unhiddenToast": "Показатель восстановлен", + "hideError": "Не удалось обновить показатель", + "allHidden": "Все показатели скрыты.", + "hiddenSection": "Скрыто" + }, + "catalog": { + "total-cholesterol": "Холестерин общий", + "ldl": "Холестерин ЛПНП", + "hdl": "Холестерин ЛПВП", + "triglycerides": "Триглицериды", + "fasting-glucose": "Глюкоза", + "hba1c": "HbA1c (гликированный гемоглобин)", + "tsh": "ТТГ (тиреотропный гормон)", + "ft3": "T3 свободный", + "ft4": "Т4 свободный", + "ferritin": "Ферритин", + "transferrin-saturation": "% насыщения трансферрина", + "vitamin-d": "Витамин 25(ОН) D", + "vitamin-b12": "Витамин B12", + "folate": "Фолиевая кислота", + "hs-crp": "СРБ (С-реактивный белок)", + "creatinine": "Креатинин", + "egfr": "Клубочковая фильтрация CKD-EPI креатинин", + "alt": "АлАТ (аланинаминотрансфераза)", + "ast": "АсАТ (аспартатаминотрансфераза)", + "ggt": "Гамма-глутамилтрансфераза (ГГТ)", + "sodium": "Натрий", + "potassium": "Калий", + "hemoglobin": "Гемоглобин", + "hematocrit": "Гематокрит", + "wbc": "Лейкоциты", + "platelets": "Тромбоциты", + "panel": { + "lipids": "Липиды", + "glucose": "Углеводный обмен", + "thyroid": "Щитовидная железа", + "iron": "Железо", + "vitamins": "Витамины", + "inflammation": "Воспаление", + "renal": "Почки", + "liver": "Печень", + "electrolytes": "Электролиты", + "bloodCount": "Общий анализ крови" + }, + "desc": { + "total-cholesterol": "Холестерин общий — это сумма холестерина, переносимого всеми липопротеиновыми частицами крови, включая фракции ЛПНП, ЛПВП и остаточные. Сам холестерин — незаменимый строительный материал для клеточных мембран, гормонов и желчных кислот. Как одно число это грубая сводка: и здоровая доля ЛПВП, и высокая доля ЛПНП поднимают общий показатель, поэтому его обычно читают вместе с отдельными фракциями. Отслеживают его в основном в рамках оценки долгосрочного сердечно-сосудистого риска.", + "ldl": "Холестерин ЛПНП — это холестерин, переносимый частицами липопротеинов низкой плотности, той фракцией, которая доставляет холестерин тканям, но может и откладывать его в стенках артерий. За годы это отложение способствует образованию атеросклеротических бляшек, поэтому ЛПНП — один из самых пристально отслеживаемых липидных показателей. Более низкое долгосрочное воздействие обычно связано с более низким сердечно-сосудистым риском. Его интерпретируют по категории риска, а не по одному фиксированному нормальному значению.", + "hdl": "Холестерин ЛПВП — это холестерин, переносимый частицами липопротеинов высокой плотности, которые собирают избыток холестерина из тканей и возвращают его в печень для переработки или выведения. Благодаря этой транспортной роли его часто называют защитной фракцией. Очень низкие уровни обычно сопровождают более высокий сердечно-сосудистый риск, хотя искусственное повышение надёжно риск не снижало, поэтому его читают как показатель, а не как цель. Обычно его интерпретируют вместе с ЛПНП и триглицеридами.", + "triglycerides": "Триглицериды — основная форма жира, циркулирующего в крови, поступающая с пищей и вырабатываемая печенью; они служат ключевым запасом энергии. Уровни растут после еды, поэтому для сопоставимости образец обычно берут натощак. Стойко высокие триглицериды связаны с метаболическим и сердечно-сосудистым риском и часто идут вместе с инсулинорезистентностью и низким ЛПВП. Их читают как один компонент общей липидной картины.", + "fasting-glucose": "Глюкоза натощак — это концентрация сахара в крови, измеренная после ночного голодания; она отражает, как организм удерживает свой базовый уровень сахара без недавней еды. Глюкоза — основное непосредственное топливо организма, и инсулин обычно держит её в узком диапазоне. Измерение натощак убирает влияние недавних приёмов пищи, что делает его стандартным скринингом того, как работает регуляция глюкозы. Это один из показателей, используемых для оценки метаболического здоровья в динамике.", + "hba1c": "HbA1c (гликированный гемоглобин) — это доля гемоглобина в эритроцитах, связавшегося с глюкозой, которая накапливается пропорционально средней экспозиции сахара в крови. Поскольку эритроциты живут около трёх месяцев, он отражает среднюю глюкозу за предыдущие два-три месяца, а не за один момент. Это делает его стабильным, не зависящим от приёмов пищи взглядом на контроль глюкозы. На его точность могут влиять состояния, меняющие продолжительность жизни эритроцитов.", + "tsh": "ТТГ (тиреотропный гормон) выделяется гипофизом, чтобы сигнализировать щитовидной железе о выработке её гормонов, и повышается или понижается, удерживая их в балансе. Благодаря этой обратной связи ТТГ — самый чувствительный первичный скрининг функции щитовидной железы: он обычно меняется раньше, чем сдвигаются сами тиреоидные гормоны. Повышенный или пониженный ТТГ указывает на гипо- или гипертиреоз и обычно побуждает напрямую измерить тиреоидные гормоны. Беременность и возраст сдвигают ожидаемый диапазон.", + "ft3": "T3 свободный (трийодтиронин) — несвязанная, биологически активная форма более сильного тиреоидного гормона, та фракция, которая доступна для действия на ткани. Большая часть циркулирующего T3 связана с транспортными белками и неактивна, поэтому именно свободная часть отражает истинную доступность гормона. Его измеряют для характеристики функции щитовидной железы, особенно вместе с ТТГ и Т4 свободным, когда результаты неясны. Уровни сильно зависят от метода анализа и читаются в клиническом контексте.", + "ft4": "Т4 свободный (тироксин) — несвязанная форма основного гормона, который щитовидная железа выделяет в кровь; он служит резервуаром, который ткани по мере необходимости превращают в более активный T3. Свободная фракция отражает то, что действительно доступно организму, независимо от уровня транспортных белков. Его обычно измеряют вместе с ТТГ, чтобы отделить проблемы самой щитовидной железы от сигналов гипофиза. Беременность и некоторые лекарства могут его сдвигать.", + "ferritin": "Ферритин — основной белок запаса железа в организме, и его уровень в крови в целом отражает общие запасы железа. Низкое значение указывает на истощённые запасы, а высокое может отражать перегрузку железом или просто воспаление, поскольку ферритин также растёт как белок острой фазы. Поэтому его часто интерпретируют вместе с другими показателями железа и признаками воспаления. Это одно из ключевых измерений для оценки статуса железа.", + "transferrin-saturation": "% насыщения трансферрина — это процент трансферрина (белка, переносящего железо через кровь), который в данный момент загружен железом. Он связывает количество железа в транспорте с железосвязывающей способностью организма, давая снимок доступности железа, дополняющий взгляд ферритина на запасы. Низкое насыщение говорит о нехватке железа, а высокое значение может указывать на перегрузку. Его читают вместе с ферритином и полной панелью железа.", + "vitamin-d": "Витамин D измеряется как 25-гидроксивитамин D — циркулирующая запасающая форма и стандартный показатель общего статуса витамина D. Организм вырабатывает его в коже под действием солнечного света и частично получает из пищи; он поддерживает баланс кальция, здоровье костей и иммунную функцию. Уровни зависят от сезона, широты, тона кожи и приёма добавок. Его отслеживают, чтобы оценить, достаточны ли запасы в динамике.", + "vitamin-b12": "Витамин В12 (кобаламин) — незаменимый витамин, получаемый в основном из продуктов животного происхождения и запасаемый преимущественно в печени. Он необходим для образования эритроцитов, синтеза ДНК и здоровья нервной системы. Длительная нехватка из-за низкого поступления или нарушенного всасывания может приводить к анемии и симптомам со стороны нервов. Его измеряют для оценки пищевого статуса, особенно там, где поступление или всасывание может быть ограничено.", + "folate": "Фолиевая кислота (витамин B9) — витамин группы B, содержащийся в листовой зелени, бобовых и обогащённых продуктах, центральный для образования эритроцитов и синтеза ДНК. Она тесно работает с витамином B12, и нехватка любого из них может давать сходный тип анемии. Достаточное количество фолиевой кислоты особенно важно в начале беременности для здорового развития плода. Её измеряют для оценки пищевого статуса и причины некоторых анемий.", + "hs-crp": "СРБ (С-реактивный белок) высокой чувствительности измеряет С-реактивный белок — показатель, который печень выделяет в ответ на воспаление, — методом, настроенным на обнаружение низких концентраций, значимых для сердечно-сосудистого риска. В отличие от стандартного СРБ, используемого при острой инфекции, высокочувствительная версия улавливает тонкое хроническое воспаление, связанное с сосудистыми заболеваниями. Поскольку любая недавняя инфекция или травма может его повысить, его интерпретируют вне острого заболевания и часто подтверждают повторным образцом. Его читают как один из вкладов в общий сердечно-сосудистый риск.", + "creatinine": "Креатинин — продукт распада нормального мышечного обмена, который почки выводят из крови с довольно постоянной скоростью. Поскольку выработка относительно постоянна, его уровень в крови служит практическим индикатором того, насколько хорошо почки очищают отходы. На значения также влияют мышечная масса, гидратация и диета, поэтому его обычно интерпретируют вместе с расчётной скоростью фильтрации. Это ключевой показатель функции почек.", + "egfr": "СКФ (расчётная скорость клубочковой фильтрации) оценивает, сколько крови почки фильтруют за минуту, рассчитывается по креатинину вместе с возрастом и полом. Она переводит сырое значение креатинина в более прямо интерпретируемую меру функции почек. Снижающаяся со временем СКФ — основной способ стадирования и отслеживания хронических изменений почек. Как оценку её читают в динамике, а не как одно точное число.", + "alt": "АлАТ (аланинаминотрансфераза) — фермент, сосредоточенный в клетках печени, высвобождаемый в кровь, когда эти клетки испытывают стресс или повреждены. Поскольку он относительно специфичен для печени, это один из основных показателей для выявления повреждения или воспаления печени. Уровни могут расти при жировой болезни печени, вирусном гепатите, алкоголе или некоторых лекарствах. Его обычно читают вместе с АсАТ и другими показателями печёночной панели.", + "ast": "АсАТ (аспартатаминотрансфераза) — фермент, встречающийся в печени, но также в мышцах, сердце и эритроцитах, высвобождаемый при повреждении любой из этих тканей. Поскольку он менее специфичен для печени, чем АлАТ, их интерпретируют вместе; их соотношение может подсказать источник и природу проблемы. Интенсивные упражнения или мышечная травма могут повышать его независимо от печени. Это один из стандартных ферментов печёночной панели.", + "ggt": "Гамма-ГТ (гамма-глутамилтрансфераза) — фермент, встречающийся в печени и желчных протоках, который особенно растёт при нарушении оттока желчи или при воздействии алкоголя. Его часто используют, чтобы прояснить, почему повышен другой печёночный показатель, например чтобы отличить печёночный или желчепротоковый источник. Он чувствителен, но не очень специфичен, поэтому его читают в контексте остальной печёночной панели. Это один из нескольких показателей для оценки здоровья печени и желчевыводящих путей.", + "sodium": "Натрий — основной электролит в жидкости вне клеток организма и главный движитель водного баланса и объёма крови. Организм строго регулирует его через жажду, гормоны и почки, поэтому его уровень в крови отражает баланс между водой и солью больше, чем одно лишь поступление с пищей. Отклонения обычно сигнализируют о нарушении водного баланса, а не самого натрия. Это ключевая часть базовой метаболической и электролитной панели.", + "potassium": "Калий — основной электролит внутри клеток организма, необходимый для передачи нервных сигналов и ровного ритма сердечной мышцы. Его уровень в крови удерживается в узком диапазоне почками и гормональными сигналами, поскольку и высокие, и низкие значения могут нарушать электрическую активность сердца. На уровни могут влиять функция почек, гидратация и несколько распространённых лекарств. Это ключевое измерение в электролитной панели.", + "hemoglobin": "Гемоглобин — железосодержащий белок в эритроцитах, который связывает кислород в лёгких и переносит его к тканям. Его концентрация — основное измерение кислородной ёмкости крови и центральный показатель для выявления анемии. Низкие значения могут отражать кровопотерю, нехватку железа или витаминов либо сниженную выработку, а высокие могут следовать за обезвоживанием или условиями низкого кислорода. Это краеугольный камень общего анализа крови.", + "hematocrit": "Гематокрит — доля объёма крови, приходящаяся на эритроциты, выраженная в процентах. Он тесно движется вместе с гемоглобином и даёт дополняющий взгляд на массу эритроцитов и кислородную ёмкость крови. На него влияет гидратация, поскольку изменения объёма плазмы сдвигают долю даже при стабильном числе эритроцитов. Его читают вместе с гемоглобином и остальным анализом крови.", + "wbc": "Лейкоциты — общее число иммунных клеток, циркулирующих в крови, мобильная защита организма от инфекции. Он растёт в ответ на инфекцию, воспаление или стресс и может падать при угнетении костного мозга или при некоторых иммунных состояниях. Поскольку он суммирует несколько разных типов клеток, заметное изменение часто сопровождают лейкоцитарной формулой, которая его раскладывает. Это ключевой компонент общего анализа крови.", + "platelets": "Тромбоциты — небольшие фрагменты клеток в крови, которые слипаются и образуют первичную пробку, останавливающую кровотечение из повреждённого сосуда. Их число отражает баланс между выработкой в костном мозге и потреблением или разрушением. Низкое число может повышать склонность к кровотечениям, а высокое может следовать за воспалением или другими стимулами. Это часть общего анализа крови и базовый индикатор способности к свёртыванию.", + "apob": "Аполипопротеин B — структурный белок, который несёт каждая из атерогенных липопротеиновых частиц, поэтому его измерение напрямую считает эти частицы, а не переносимый ими холестерин. Поскольку на каждой частице ЛПНП, ЛПОНП и родственных частицах сидит одна молекула ApoB, он может уловить сердечно-сосудистый риск, который упускает значение холестерина ЛПНП, особенно когда число частиц и содержание холестерина расходятся. Поэтому его всё чаще используют для уточнения липидной оценки риска. Его интерпретируют вместе со стандартной липидной панелью.", + "lp-a": "Липопротеин (a) — частица, подобная ЛПНП, с дополнительным присоединённым белком; его уровень в значительной мере задан генетически и остаётся довольно стабильным на протяжении жизни. Повышенный Lp(a) — независимый наследственный фактор риска сердечно-сосудистых заболеваний и сужения аортального клапана. Поскольку он меняется мало, его обычно измеряют один раз, чтобы установить пожизненный риск человека, а не отслеживают многократно. Его выражают в молярных единицах и читают как часть общего сердечно-сосудистого риска.", + "fasting-insulin": "Инсулин натощак — уровень инсулина (гормона, который переносит глюкозу из крови в клетки), измеренный после ночного голодания. В паре с глюкозой натощак он помогает оценить инсулинорезистентность — состояние, при котором организму нужно больше инсулина, чтобы удерживать глюкозу в диапазоне. Высокий инсулин натощак при нормальной глюкозе может быть ранним признаком того, что эта компенсация уже идёт. Его читают как часть картины метаболического здоровья, а не изолированно.", + "omega-3-index": "Омега-3 индекс — это доля EPA и DHA (двух длинноцепочечных морских омега-3 жирных кислот) среди жирных кислот в мембранах эритроцитов. Поскольку эритроциты обновляются медленно, он отражает долгосрочное поступление омега-3, а не недавний приём пищи. Более высокий индекс в наблюдательных исследованиях связывали с более низким сердечно-сосудистым риском. Его отслеживают как стабильный показатель статуса омега-3, который отвечает на диету в течение месяцев.", + "alkaline-phosphatase": "Щелочная фосфатаза (ЩФ) — фермент, встречающийся главным образом в печени, желчных протоках и костях. Он растёт при блокировке оттока желчи и в фазы активного построения кости, например при росте у детей и подростков или при заживлении кости. Поскольку его выделяют оба органа, повышенное значение обычно читают вместе с ГГТ и другими печёночными показателями, чтобы отличить печёночный источник от костного. Это один из стандартных показателей печёночной панели.", + "bilirubin-total": "Билирубин общий — жёлтый продукт распада гемоглобина из отживших эритроцитов, измеряемый как сумма его несвязанной и связанной форм. Печень захватывает его, связывает и выводит с желчью, поэтому уровень отражает, насколько хорошо работает этот путь. Он может расти при болезни печени, закупорке желчных протоков или усиленном распаде эритроцитов, а также безвредно при синдроме Жильбера. Его читают вместе с другими печёночными показателями." + }, + "apob": "Аполипопротеин В", + "lp-a": "Липопротеин (а)", + "fasting-insulin": "Инсулин", + "omega-3-index": "Индекс омега-3", + "alkaline-phosphatase": "Щелочная фосфатаза", + "bilirubin-total": "Билирубин общий" + }, + "noteLoadFailed": "Заметку не удалось загрузить; при сохранении она останется без изменений.", + "showingLatestOf": "Показаны последние {shown} из {total} измерений", + "convertedFrom": "пересчитано из {value} {unit}", + "ocr": { + "scanButton": "Сканировать отчёт", + "addScan": "Сканировать документ", + "addManual": "Добавить значение вручную", + "uploadHint": "Загрузите фото или PDF бланка анализов", + "acceptWithPdf": "JPEG, PNG, WebP или PDF", + "acceptImageOnly": "JPEG, PNG или WebP", + "extracting": "Читаем ваш отчёт…", + "readingOnDevice": "Читаем на вашем устройстве…", + "localModeHint": "Читается на вашем устройстве, затем отправляется как текст. Менее точно: проверьте каждое значение.", + "rangeFromScan": "Референсный диапазон взят со скана", + "rangeVerify": "Проверьте референсный диапазон", + "reviewTitle": "Проверьте перед сохранением", + "reviewHint": "Проверьте каждое измерение, затем сохраните те, что хотите оставить.", + "foundCount": "Найдено измерений: {count}", + "pagesCapped": "Прочитаны только первые {read} из {total} страниц. Значения на последующих страницах в этот список не входят.", + "stoppedBudget": "Бюджет ИИ на сегодня закончился посреди отчёта, поэтому оставшиеся страницы не прочитаны.", + "stoppedUnavailable": "ИИ был выключен во время чтения отчёта, поэтому оставшиеся страницы не прочитаны.", + "stoppedError": "Сканирование не удалось продолжить из-за ошибки сервера, поэтому оставшиеся страницы не прочитаны. Попробуйте позже.", + "tooLarge": "Этот текст слишком длинный для одного сканирования. Сканируйте отчёт постранично.", + "truncated": "Провайдер ИИ достиг предела вывода до конца отчёта. Измерения после этого места могут отсутствовать, поэтому сверьте список с отчётом.", + "truncatedPages": "Провайдер ИИ достиг предела вывода посреди этих страниц: {pages}. Измерения ниже могут отсутствовать, поэтому сверьте их с отчётом.", + "unreadPages": "Эти страницы не удалось прочитать, и их измерения в этот список не входят: {pages}.", + "unreadParts": "Часть отчёта не удалось прочитать, и её измерения в этот список не входят.", + "rowsCapped": "В отчёте указано измерений: {found}. Одно сканирование вмещает {kept}, поэтому показаны только первые {kept}.", + "outputLimit": "Провайдер ИИ достиг предела вывода, не вернув ни одного измерения. Попробуйте фото одной страницы или модель, допускающую более длинные ответы.", + "errorTooLong": "Сократите до {max} символов.", + "confirmRow": "Включить это измерение", + "analyteLabel": "Название анализа", + "resultLabel": "Результат", + "valueLabel": "Значение", + "unitLabel": "Единица", + "dateLabel": "Дата", + "refLowLabel": "Нижняя граница", + "refHighLabel": "Верхняя граница", + "newBiomarker": "Новый показатель, будет создан", + "linksExisting": "Связать с существующим {name}", + "duplicateWarning": "Совпадающее измерение уже есть", + "lowConfidence": "Пожалуйста, перепроверьте это значение", + "lowConfidenceBadge": "Низкая уверенность", + "valueUnreadable": "Значение не читается. Введите его вручную", + "saveSelected": "Сохранить выбранные ({count})", + "discardAll": "Отклонить все", + "savedToast": "Сохранено результатов анализа: {count}", + "savedPartialToast": "Сохранено результатов анализа: {count}, пропущено как дубликаты: {skipped}", + "savedNothingToast": "Ничего не сохранено: измерений уже было записано: {skipped}", + "savedEmptyToast": "Нечего сохранять", + "noRows": "В этом отчёте не удалось найти ни одного измерения.", + "nothingToSave": "Выберите хотя бы одно измерение для сохранения.", + "validationSummary": "Измерений, требующих внимания: {count}. Заполните отмеченные поля или снимите выбор с этих измерений.", + "errorDate": "Укажите дату взятия образца.", + "errorAnalyte": "Укажите название показателя.", + "errorValue": "Укажите значение.", + "errorResult": "Укажите результат.", + "errorUnit": "Укажите единицу.", + "errorUnitMismatch": "Этот показатель отслеживается в {markerUnit}. Измените единицу, если отчёт прочитан неверно, или снимите выбор с этого измерения.", + "unitDiffersBadge": "Отслеживается в {markerUnit}; в этом отчёте указано {unit}", + "unitConvertedBadge": "Сохранено как {value} {markerUnit}, пересчитано из {statedValue} {unit}", + "savedPartialUnitToast": "Сохранено результатов анализа: {count}. Не сохранено из-за несовпадения единицы с показателем: {analytes}", + "savedNothingUnitToast": "Ничего не сохранено: единица не совпадает с показателем для {analytes}", + "saveFailed": "Не удалось сохранить измерения. Попробуйте ещё раз.", + "providerUnsupported": "Ваш провайдер ИИ не умеет читать изображения. Настройте модель с поддержкой изображений.", + "consentRequired": "Для сканирования отчёта нужно согласие на обработку ИИ.", + "rateLimited": "Слишком много сканирований. Попробуйте позже.", + "budgetExceeded": "Бюджет использования ИИ на сегодня исчерпан.", + "fileTooLarge": "Файл слишком большой (максимум 12 МБ).", + "fileType": "Загрузите JPEG, PNG, WebP или PDF.", + "extractFailed": "Не удалось прочитать отчёт. Попробуйте более чёткое фото.", + "pdfNeedsAnthropic": "Для сканирования PDF нужен провайдер Claude с поддержкой изображений; загрузите фото вместо этого.", + "refTextLabel": "Диапазон как напечатано", + "refTextPlaceholder": "например 3.5 - 5.0", + "aiUnavailable": "Сканирование отчёта с помощью ИИ здесь сейчас недоступно." + }, + "loadMoreReadings": "Загрузить больше измерений", + "documentsLink": "Документы анализов", + "notLinkedYet": "Пока не связано с показателем", + "sourceRange": { + "fromReport": "Диапазон из отчёта {range}", + "catalogDiffers": "ваш диапазон {range}", + "printed": "как напечатано в {unit}: {range}" + }, + "match": { + "viaAlias": "по имени, которое вы выбрали раньше", + "viaCatalog": "распознано как распространённое сокращение", + "chooseLabel": "Относится к", + "suggestionOption": "{name} ({unit})", + "newMarkerOption": "Новый показатель", + "rememberHint": "Это имя запомнится для следующего отчёта.", + "chooseHint": "Выберите показатель, если это тот, который вы уже отслеживаете." + }, + "aliases": { + "title": "Также пишется как", + "taken": "{alias} уже относится к другому показателю.", + "saveError": "Не удалось сохранить имена. Попробуйте ещё раз.", + "remove": "Убрать {alias}", + "empty": "Добавьте имена, которые печатают другие лаборатории для {name}, чтобы их отчёты попадали сюда.", + "placeholder": "например Alk.P", + "addLabel": "Другое имя для этого показателя", + "add": "Добавить", + "alsoWritten": "Также пишется как {aliases}" + }, + "merge": { + "open": "Объединить", + "title": "Объединить показатели", + "description": "Объедините показатели, которые являются одним и тем же анализом, записанным по-разному.", + "pickHint": "Выберите хотя бы два показателя.", + "keepLabel": "Оставить", + "keepHint": "Остальные перейдут в этот, а их имена станут его другими именами.", + "showPreview": "Показать предпросмотр", + "back": "Назад", + "confirm": "Объединить сейчас", + "previewSummaryOne": "{count} измерение перейдёт в {name} ({unit}).", + "previewSummaryFew": "{count} измерения перейдут в {name} ({unit}).", + "previewSummaryOther": "{count} измерений перейдут в {name} ({unit}).", + "movesOne": "{count} измерение, уже в той же единице", + "movesFew": "{count} измерения, уже в той же единице", + "movesOther": "{count} измерений, уже в той же единице", + "convertedOne": "{count} измерение, пересчитано из {unit} в {targetUnit}", + "convertedFew": "{count} измерения, пересчитаны из {unit} в {targetUnit}", + "convertedOther": "{count} измерений, пересчитаны из {unit} в {targetUnit}", + "refused": "{unit} нельзя пересчитать в {targetUnit}.", + "aliasesAdded": "Эти имена будут вести к оставленному показателю:", + "blocked": "Объединить нельзя, пока единицу не удаётся пересчитать. Исключите этот показатель или оставьте другой.", + "noUndo": "Объединение нельзя отменить.", + "doneToastOne": "Объединено в {name}, перенесено измерений: {count}", + "doneToastFew": "Объединено в {name}, перенесено измерений: {count}", + "doneToastOther": "Объединено в {name}, перенесено измерений: {count}", + "error": "Не удалось объединить показатели. Попробуйте ещё раз." + }, + "trend": { + "title": "Динамика", + "slope": { + "rising": "Рост примерно на {amount} {unit} в год по {n} измерениям с {since}.", + "falling": "Снижение примерно на {amount} {unit} в год по {n} измерениям с {since}.", + "flat": "Без изменений по {n} измерениям с {since}." + }, + "projection": { + "exits": { + "high": "Если бы эта прямая продолжилась, она достигла бы верхней границы вашего референсного диапазона примерно {date}. Это прогноз, а не предсказание.", + "low": "Если бы эта прямая продолжилась, она достигла бы нижней границы вашего референсного диапазона примерно {date}. Это прогноз, а не предсказание." + }, + "beyond_horizon": "При таком темпе линия остаётся внутри вашего референсного диапазона более {years} лет — периода, который охватывают ваши измерения.", + "beyond_horizon_capped": "При таком темпе линия остаётся внутри вашего референсного диапазона более {years} лет — настолько далеко, насколько смотрит прогноз.", + "no_exit": "Линия уходит от краёв вашего референсного диапазона.", + "already_outside": "Линия уже находится вне вашего референсного диапазона.", + "no_clear_trend": "По этим измерениям изменение неотчётливо отличается от отсутствия изменений, поэтому прогноз не строится.", + "stale": "Самое новое измерение — от {date}, более года назад. Линия показана по состоянию на тот момент, без прогноза." + }, + "interval": "95 % интервал годового изменения: от {lo} до {hi} {unit}." + } + }, + "modules": { + "cycle": { + "label": "Цикл", + "description": "Отслеживайте менструацию, фазы и прогнозы." + }, + "mood": { + "label": "Настроение", + "description": "Записывайте ежедневное настроение и теги." + }, + "sleep": { + "label": "Сон", + "description": "Продолжительность сна, фазы и хронология." + }, + "glucose": { + "label": "Глюкоза", + "description": "Измерения глюкозы крови и динамика." + }, + "workouts": { + "label": "Тренировки", + "description": "Тренировочные сессии и активность." + }, + "recovery": { + "label": "Восстановление", + "description": "Показатели восстановления и напряжения с ваших устройств." + }, + "labs": { + "label": "Результаты анализов", + "description": "Записывайте результаты анализов и храните их историю." + }, + "achievements": { + "label": "Достижения", + "description": "Значки и серии для вашей рутины." + }, + "coach": { + "label": "Тренер", + "description": "Чат с ИИ на основе ваших собственных данных." + }, + "insights": { + "label": "Анализ ИИ", + "description": "Брифинг, заметки о состоянии и заметки о тренировках, написанные моделью, но никогда — ваши данные или баллы." + }, + "doctorReport": { + "label": "Отчёт для врача", + "description": "Экспорт в PDF и FHIR для вашей клиники." + }, + "medications": { + "label": "Лекарства", + "description": "Расписания, приёмы и приверженность." + }, + "illness": { + "label": "Дневник заболеваний", + "description": "Отслеживайте эпизоды заболеваний и состояний с ежедневной хронологией симптомов." + }, + "mcp": { + "label": "Доступ для внешнего ассистента (MCP)", + "description": "Доступ на чтение для ассистента с поддержкой MCP через токен с ограниченными правами." + }, + "environment": { + "label": "Окружение", + "description": "Ежедневная погода и дневной свет для вашего местоположения рядом с настроением, сном и показателями." + }, + "inboundDocuments": { + "label": "Документы", + "description": "Медицинские письма, отчёты и сканы в одном зашифрованном месте с поиском." + }, + "mentalHealth": { + "label": "Психическое благополучие", + "description": "Четыре опциональных скрининга рядом с отслеживанием настроения." + }, + "nutrients": { + "label": "Приём нутриентов", + "description": "Ежедневные итоги микронутриентов, синхронизированные из Apple Health." + }, + "vaccinations": { + "label": "Вакцинация", + "description": "Запись о вакцинации в структурированном виде: доза, серия, следующая ревакцинация." + }, + "timeline": { + "label": "Хронология", + "description": "Годы одним взглядом: состояния, лекарства и визиты рядом с вашими измерениями, плюс ваши собственные события жизни." + } + }, + "moduleOff": { + "disabled": { + "description": "{module} выключен для этой записи, поэтому его страницы скрыты. Включите его снова, чтобы вернуть их.", + "title": "{module} выключен" + }, + "notGranted": { + "description": "{module} находится вне разделов, открытых вам. Что охватывает общая запись, решает её владелец.", + "title": "Не входит в общий доступ" + }, + "unavailable": { + "description": "Администратор выключил {module} для всех аккаунтов на этом сервере. Никакая ваша настройка не вернёт его.", + "title": "Недоступно на этом сервере" + }, + "openModules": "Открыть Настройки, Модули" + }, + "vaccinations": { + "title": "Вакцинация", + "subtitle": "Ваша запись о прививках, доза за дозой.", + "listLoadError": "Не удалось загрузить вакцинации.", + "series": { + "booster": "Ревакцинация", + "ofTotal": "Доза {position} из {total}", + "doseN": "Доза {position}" + }, + "row": { + "lot": "Серия {lot}" + }, + "form": { + "date": "Дата", + "catalogLabel": "Вакцина", + "identityHint": "Выберите вакцину из списка или введите её ниже. Достаточно любого из вариантов.", + "catalogNone": "Выберите вакцину", + "catalogSearch": "Поиск вакцин", + "catalogNoMatch": "Запись в каталоге не найдена", + "catalogClear": "Снять выделение", + "freeTextLabel": "Свободный текст", + "freeTextPlaceholder": "как написано в записи", + "seriesToggle": "Добавить данные серии", + "doseNumber": "№ дозы", + "seriesDoses": "Доз в серии", + "lot": "Номер серии", + "site": "Место инъекции", + "siteNone": "Не указано", + "practitioner": "Клиника или врач", + "note": "Заметка", + "linkDocuments": "Связать документ", + "linkNothingToOffer": "Документов пока нет." + }, + "site": { + "LEFT_ARM": "Левое плечо", + "RIGHT_ARM": "Правое плечо", + "LEFT_THIGH": "Левое бедро", + "RIGHT_THIGH": "Правое бедро", + "ORAL": "Перорально", + "NASAL": "Интраназально", + "OTHER": "Другое" + }, + "createTitle": "Записать вакцинацию", + "editTitle": "Изменить вакцинацию", + "formDescription": "Достаточно даты и вакцины; всё остальное необязательно.", + "created": "Вакцинация сохранена", + "updated": "Вакцинация обновлена", + "saveFailed": "Не удалось сохранить вакцинацию.", + "deleteTitle": "Удалить эту вакцинацию?", + "deleteDescription": "Запись будет удалена из вашей истории. Запланированное напоминание о ревакцинации останется.", + "deleteFailed": "Не удалось удалить вакцинацию.", + "info": { + "primarySeriesOne": "Первичная серия: {count} доза", + "primarySeriesFew": "Первичная серия: {count} дозы", + "primarySeriesOther": "Первичная серия: {count} доз", + "yearly": "Ежегодная вакцинация", + "boosterYearsOne": "Ревакцинация обычно каждые {count} год", + "boosterYearsFew": "Ревакцинация обычно каждые {count} года", + "boosterYearsOther": "Ревакцинация обычно каждые {count} лет", + "boosterMonthsOne": "Ревакцинация обычно каждые {count} месяц", + "boosterMonthsFew": "Ревакцинация обычно каждые {count} месяца", + "boosterMonthsOther": "Ревакцинация обычно каждые {count} месяцев", + "standard60": "Стандартная вакцинация с 60 лет", + "sourceLabel": "Источник: {source}", + "affordanceLabel": "Информация о схеме" + }, + "booster": { + "title": "Запланировать ревакцинацию?", + "body": "Вы можете поставить напоминание о следующей ревакцинации от этой дозы. Измените интервал или название либо откажитесь.", + "interval": "Интервал", + "label": "Название", + "labelSuffix": "ревакцинация", + "decline": "Не сейчас", + "confirm": "Поставить напоминание", + "planned": "Ревакцинация запланирована", + "failed": "Не удалось создать напоминание.", + "everyYearsOne": "каждые {count} год", + "everyYearsFew": "каждые {count} года", + "everyYearsOther": "каждые {count} лет", + "everyMonthsOne": "каждые {count} месяц", + "everyMonthsFew": "каждые {count} месяца", + "everyMonthsOther": "каждые {count} месяцев" + }, + "suggestion": { + "single": "Привязать к этой вакцинации?", + "choose": "К какой вакцинации относится этот скан?", + "linked": "Связано с вакцинацией", + "failed": "Не удалось связать.", + "unnamed": "Вакцинация" + }, + "empty": { + "title": "Вакцинаций пока нет", + "description": "Перенесите свой прививочный сертификат строка за строкой. Достаточно даты и вакцины." + }, + "catalog": { + "tetanus": "Столбняк", + "diphtheria": "Дифтерия", + "pertussis": "Коклюш", + "polio": "Полиомиелит", + "measles": "Корь", + "mumps": "Эпидемический паротит", + "rubella": "Краснуха", + "varicella": "Ветряная оспа", + "hib": "Hib (гемофильная палочка типа b)", + "hepatitis-a": "Гепатит A", + "hepatitis-b": "Гепатит B", + "influenza": "Грипп", + "pneumococcal": "Пневмококк", + "herpes-zoster": "Опоясывающий лишай (герпес зостер)", + "rsv": "РСВ", + "covid-19": "COVID-19", + "fsme": "Клещевой энцефалит", + "hpv": "ВПЧ (вирус папилломы человека)", + "meningococcal-acwy": "Менингококк ACWY", + "meningococcal-b": "Менингококк B", + "rotavirus": "Ротавирус", + "typhoid": "Брюшной тиф", + "rabies": "Бешенство", + "yellow-fever": "Жёлтая лихорадка", + "japanese-encephalitis": "Японский энцефалит", + "cholera": "Холера", + "dengue": "Лихорадка денге", + "tuberculosis": "Туберкулёз", + "td": "Td (столбняк, дифтерия)", + "tdap": "Tdap (столбняк, дифтерия, коклюш)", + "tdap-ipv": "Tdap-IPV (четырёхкомпонентная)", + "dtap-ipv": "DTaP-IPV (детская четырёхкомпонентная)", + "hexavalent": "Шестикомпонентная (DTaP-IPV-Hib-HepB)", + "mmr": "КПК (корь, паротит, краснуха)", + "mmrv": "КПКВ (корь, паротит, краснуха, ветряная оспа)", + "hepa-hepb": "Гепатит A и B", + "hepa-typhoid": "Гепатит A и брюшной тиф" + }, + "renewal": { + "overdue": "Ревакцинация просрочена с {date}", + "dueSoon": "Ревакцинация {date}", + "current": "Следующая ревакцинация {date}" + }, + "custom": { + "title": "Свои вакцины", + "add": "Добавить свою вакцину", + "name": "Название", + "components": "Защищает от", + "seriesDoses": "Доз в первичной серии", + "boosterMonths": "Ревакцинация каждые (месяцев)", + "saved": "Вакцина сохранена", + "deleted": "Вакцина убрана", + "deleteConfirm": "Убрать эту вакцину? Уже записанные дозы сохранят своё название.", + "saveFailed": "Не удалось сохранить вакцину.", + "nameTaken": "У вас уже есть вакцина с таким названием.", + "editTitle": "Изменить свою вакцину", + "description": "Вакцина, которой нет в каталоге, учитывается как любая запись каталога.", + "componentsHint": "Выберите каждое заболевание, от которого она защищает.", + "boosterHint": "Оставьте пустым, если ревакцинации нет.", + "protectsAgainst": "Защищает от {list}.", + "deleteTitle": "Убрать свою вакцину?", + "sectionDescription": "Вакцины, которые вы добавили сами, потому что их нет в каталоге.", + "catalogGroup": "Каталог" + } + }, + "illness": { + "title": "Заболевание", + "subtitle": "Ретроспективный дневник ваших эпизодов заболеваний и состояний.", + "settings": { + "viewDescription": "Выберите, показывать эпизоды карточками или компактным списком.", + "orderDescription": "Перетащите эпизоды в нужный вам порядок." + }, + "customize": "Настроить дневник заболеваний", + "newEpisode": "Новый эпизод", + "logDay": "Записать день", + "markRecovered": "Отметить выздоровление", + "deletedToast": "Эпизод удалён", + "restoreError": "Не удалось восстановить эпизод", + "onsetOn": "Начало {date}", + "recoveredOn": "выздоровление {date}", + "status": { + "active": "Активно", + "ongoing": "Продолжается", + "recovered": "Выздоровел" + }, + "empty": { + "title": "Эпизодов пока нет", + "body": "Начните эпизод, чтобы вести ежедневную хронологию симптомов и вспоминать, как всё разворачивалось." + }, + "type": { + "INFECTION": "Инфекция", + "ALLERGY": "Аллергия", + "INJURY": "Травма", + "MENTAL_HEALTH": "Психическое здоровье", + "AUTOIMMUNE": "Аутоиммунное", + "CHRONIC": "Хроническое", + "OTHER": "Другое" + }, + "lifecycle": { + "ACUTE": "Острое", + "CHRONIC_ONGOING": "Хроническое / текущее", + "RECURRING": "Рецидивирующее", + "FLARE": "Обострение" + }, + "new": { + "title": "Новый эпизод", + "description": "Запишите заболевание или состояние. Ежедневные симптомы можно записывать потом.", + "label": "Название", + "labelPlaceholder": "например Простуда", + "type": "Тип", + "lifecycle": "Курс", + "onset": "Началось", + "note": "Заметка", + "notePlaceholder": "Всё, что стоит запомнить (зашифровано).", + "saveError": "Не удалось сохранить эпизод. Попробуйте ещё раз.", + "parent": "Часть", + "parentNone": "Не связано", + "resolved": "Закончилось", + "resolvedHelp": "Оставьте пустым, пока эпизод продолжается.", + "markOngoing": "Всё ещё продолжается", + "bodySiteHint": "Например колено или поясница." + }, + "sheet": { + "title": "Запись за {date}", + "description": "Запишите сегодняшние симптомы, как вы себя чувствуете и температуру.", + "symptoms": "Симптомы", + "functionalImpact": "Как вы себя чувствуете", + "fever": "Температура", + "note": "Заметка", + "noteSet": "Задано", + "notePlaceholder": "Каким был день (зашифровано).", + "severityFor": "Тяжесть для {symptom}", + "saveError": "Не удалось сохранить день. Попробуйте ещё раз.", + "day": "День" + }, + "impact": { + "0": "Полностью работоспособен", + "1": "Слегка ограничен", + "2": "В основном отдыхаю", + "3": "Прикован к постели" + }, + "symptom": { + "runnyNose": "Насморк", + "stuffyNose": "Заложенность носа", + "sneezing": "Чихание", + "soreThroat": "Боль в горле", + "cough": "Кашель", + "headache": "Головная боль", + "bodyAches": "Ломота в теле", + "fatigue": "Усталость" + }, + "correlation": { + "title": "Как всё разворачивалось", + "learning": "Ещё учимся. Запишите ещё несколько дней, чтобы увидеть здесь закономерности.", + "preOnsetTitle": "Как это дало о себе знать", + "preOnsetBody": "Сигналы, которые отклонились от вашего базового уровня до того, как вы отметили начало.", + "nadirTitle": "Что изменилось", + "nadirBody": "Насколько каждый отслеживаемый сигнал отклонился от вашего типичного диапазона.", + "recoveryGapTitle": "Разрыв восстановления", + "recoveryGapLag": "Ваши показатели пришли в норму через {days} дней после того, как вы почувствовали себя лучше.", + "recoveryGapLead": "Ваши показатели пришли в норму за {days} дней до того, как вы отметили выздоровление.", + "recoveryGapLagSymptom": "Вы почувствовали себя лучше за {days} дней до того, как записанные симптомы ослабли.", + "recoveryGapLeadSymptom": "Записанные симптомы ослабли за {days} дней до того, как вы отметили выздоровление.", + "recoveryGapSame": "Ваши показатели пришли в норму в тот же день, когда вы почувствовали себя лучше.", + "sleepContextMore": "Во время этого эпизода вы спали заметно больше обычного (около {hours} ч за ночь).", + "sleepContextLess": "Во время этого эпизода вы спали заметно меньше обычного (около {hours} ч за ночь).", + "redFlagTitle": "Стоит присмотреться", + "redFlagSpo2": "Ваше насыщение кислородом оставалось низким несколько дней. Если это повторится, обратитесь за медицинской помощью.", + "redFlagFever": "У вас была стойкая температура. Если это повторится, обратитесь за медицинской помощью.", + "direction": { + "above": "выше вашей нормы", + "below": "ниже вашей нормы" + }, + "settled": "Во время этого эпизода ничего заметного не выходило за пределы вашего обычного диапазона." + }, + "insights": { + "title": "Ваша история заболеваний", + "countOne": "За этот период вы записали 1 эпизод.", + "countOther": "За этот период вы записали эпизодов: {count}.", + "typicalGap": "Типичный разрыв восстановления: {days} дней между улучшением самочувствия и нормализацией показателей.", + "typicalGapWithDriver": "Типичный разрыв восстановления: {days} дней; вы обычно чувствуете себя лучше раньше, чем нормализуется {vital}.", + "typicalGapLearning": "Ещё несколько завершённых эпизодов, и здесь появится типичный разрыв восстановления.", + "none": "За этот период эпизодов не записано.", + "analyze": "Проанализировать разрыв восстановления" + }, + "section": { + "active": "Активные", + "resolved": "Завершённые" + }, + "flares": { + "countOne": "1 обострение", + "countOther": "{count} обострений" + }, + "timeline": { + "title": "Хронология дня", + "error": "Не удалось загрузить хронологию.", + "severity": "Тяжесть {severity}", + "noSymptoms": "Симптомы не записаны.", + "impact": "Как вы себя чувствовали: {impact}", + "fever": "Температура: {value} {unit}", + "empty": "Дни пока не записаны." + }, + "loadError": "Не удалось загрузить этот эпизод.", + "backToList": "Назад к дневнику", + "detail": { + "note": "Заметка" + }, + "edit": { + "title": "Изменить эпизод", + "description": "Обновите данные этого эпизода." + }, + "menu": { + "label": "Действия с эпизодом" + }, + "deleteConfirm": { + "title": "Удалить этот эпизод?", + "body": "«{label}» и все его записи по дням будут удалены. В течение короткого момента это можно отменить." + }, + "vital": { + "RESTING_HEART_RATE": "ЧСС в покое", + "HEART_RATE_VARIABILITY": "Вариабельность сердечного ритма", + "HRV_RMSSD": "HRV (RMSSD)", + "RECOVERY_SCORE": "Восстановление", + "OXYGEN_SATURATION": "Насыщение кислородом", + "BODY_TEMPERATURE": "Температура тела", + "RESPIRATORY_RATE": "Частота дыхания", + "BLOOD_PRESSURE_SYS": "Систолическое АД", + "BLOOD_PRESSURE_DIA": "Диастолическое АД", + "PULSE": "Пульс", + "WEIGHT": "Вес", + "FUNCTIONAL_IMPACT": "Функциональное состояние" + }, + "listLoadError": "Не удалось загрузить ваши эпизоды." + }, + "coach": { + "reminderSuggestion": { + "title": "Поставить напоминание?", + "accept": "Поставить напоминание", + "dismiss": "Не сейчас", + "stop": "Я измеряю достаточно", + "accepted": "Напоминание поставлено", + "dismissed": "Хорошо, больше не буду это предлагать", + "stopped": "Понял, больше не буду предлагать напоминания", + "failed": "Не удалось это настроить. Попробуйте ещё раз", + "cadence": { + "weightDaily": "Взвешивайтесь ежедневно примерно в одно и то же время", + "bp722": "Измеряйте АД дважды в день в течение недели", + "glucoseStructured": "Проверяйте глюкозу по структурированному ежедневному расписанию" + } + }, + "suggestedAction": { + "apply": "Добавить", + "dismiss": "Не сейчас", + "applied": "Добавлено", + "dismissed": "Отклонено", + "failed": "Не удалось добавить. Попробуйте ещё раз", + "checkup": { + "title": "Добавить напоминание о проверке?" + }, + "note": { + "title": "Сохранить напоминание?" + }, + "interval": { + "yearly": "Каждый год", + "halfYearly": "Каждые шесть месяцев", + "quarterly": "Каждые три месяца", + "monthly": "Каждый месяц" + } + }, + "settings": { + "reminderSuggestionsLabel": "Предложения по частоте", + "reminderSuggestionsDescription": "Разрешить Коучу изредка предлагать обоснованное напоминание измерять показатель регулярнее." + }, + "plans": { + "title": "Планы", + "pageDescription": "Планы «если — то», согласованные в ваших беседах с Коучем. Подтвердите предложение, чтобы оно стало частью памяти Коуча.", + "readOnlyNote": "Коуч сейчас недоступен, но вы всё ещё можете читать и удалять свои планы.", + "proposalTitle": "Предложение плана", + "ifThen": "Если {cue}, то {action}.", + "targetPrefix": "Цель: {target}", + "reviewPrefix": "Проверка: {when}", + "accept": "Принять план", + "decline": "Отклонить", + "accepted": "План принят. Коуч будет его учитывать.", + "declined": "Предложение отклонено.", + "failed": "Не получилось. Попробуйте ещё раз.", + "markMet": "Цель достигнута", + "abandon": "Завершить план", + "remove": "Убрать", + "removeTitle": "Убрать этот план?", + "removeBody": "План и его ход исчезнут из вашей истории. Вернуть их будет нельзя.", + "removeConfirm": "Убрать план", + "empty": "Планов пока нет. Когда вы берёте на себя конкретное намерение «если — то» в беседе, Коуч предлагает его здесь для подтверждения.", + "groupProposed": "Предложения", + "groupActive": "Активные", + "groupPast": "Завершённые", + "status": { + "proposed": "Предложен", + "active": "Активен", + "met": "Достигнут", + "abandoned": "Завершён", + "review_due": "Пора проверить", + "reviewed": "Проверен" + } + }, + "refusal": { + "outOfScope": "Я могу помочь только с показателями здоровья в вашем журнале: измерения, лекарства, настроение, динамика. На вопросы вне этой области я ответить не могу.", + "promptInjection": "Я заметил формулировку, которая пытается переопределить мои инструкции. Я Коуч HealthLog и только обобщаю ваши собственные данные о здоровье. Пожалуйста, переформулируйте вопрос в этих терминах.", + "conversationPoisoned": "Более раннее сообщение в этой беседе содержит формулировку, которая переопределяет мои инструкции. Пожалуйста, начните новую беседу." + }, + "noRecordedData": "У меня нет записанных измерений по тому, о чём вы спросили, поэтому мне не из чего привести цифру. Как только вы что-то запишете, спросите снова, и я буду исходить из ваших собственных чисел.", + "step": { + "read": "Проверяю: {domain}", + "readWindow": "Проверяю: {domain}, {window}", + "snapshot": "Читаю сводку вашей записи", + "showResult": "Открываю более раннюю таблицу", + "reuse": "Использую таблицу из прошлого раза", + "headerActive": "{label}…", + "listLabel": "Что просмотрел Коуч", + "toggleShow": "Показать, что просмотрел Коуч", + "toggleHide": "Скрыть, что просмотрел Коуч", + "announceDone": "Готово: {label}", + "readingsOne": "1 измерение", + "readingsFew": "Измерений: {count}", + "readingsOther": "Измерений: {count}", + "rowsOne": "1 строка", + "rowsFew": "{count} строки", + "rowsOther": "{count} строк", + "metricsOne": "1 показатель", + "metricsFew": "{count} показателя", + "metricsOther": "{count} показателей", + "reason": { + "noData": "нет измерений", + "outsideWindow": "нет измерений в этом окне", + "moduleDisabled": "выключено", + "retrievalFailed": "не удалось прочитать", + "invalidArguments": "запрос не понят" + }, + "domain": { + "labs": "Результаты анализов", + "illness": "Заболевание и восстановление", + "cycle": "Цикл", + "correlations": "Связи между показателями", + "snapshot": "Сводка записи", + "environment": "Погода и воздух", + "day": "Один день" + }, + "window": { + "last7days": "последние 7 дней", + "last30days": "последние 30 дней", + "last90days": "последние 90 дней", + "lastYear": "последние 12 месяцев", + "allTime": "всё время" + }, + "period": { + "current": "этот период", + "previous": "предыдущий период", + "yearAgo": "годом ранее" + }, + "granularity": { + "day": "по дням", + "week": "по неделям", + "month": "по месяцам" + } + }, + "result": { + "title": { + "byDay": "{metric} по дням", + "byWeek": "{metric} по неделям", + "byMonth": "{metric} по месяцам", + "previousPeriod": "{metric}, предыдущий период", + "yearAgo": "{metric}, годом ранее", + "workoutsBySport": "Тренировки по видам спорта", + "labsLatest": "Последние результаты анализов", + "sleepByNight": "Сон по ночам", + "complianceByDay": "Приверженность лекарствам по дням", + "distribution": "{metric}: как часто встречался каждый диапазон" + }, + "column": { + "day": "День", + "week": "Неделя", + "month": "Месяц", + "night": "Ночь", + "sport": "Вид спорта", + "sessions": "Сессии", + "analyte": "Анализ", + "value": "Значение", + "unit": "Единица", + "date": "Дата", + "referenceRange": "Референсный диапазон", + "systolic": "Систолическое", + "diastolic": "Диастолическое", + "mean": "Среднее", + "total": "Всего", + "min": "Наименьшее", + "max": "Наибольшее", + "readings": "Измерения", + "rate": "Приверженность", + "duration": "Длительность", + "range": "Диапазон", + "count": "Раз" + }, + "other": "Другое", + "noReading": "нет измерения", + "showAll": "Показать все ({count})", + "showFewer": "Показать меньше", + "copyMenu": "Копировать таблицу", + "copyForSpreadsheet": "Копировать для таблицы", + "copyAsText": "Копировать как текст", + "copied": "Скопировано", + "copyFailed": "Не удалось скопировать таблицу", + "viewLabel": "Вид", + "viewChart": "График", + "viewTable": "Таблица", + "chartSummary": "{title}, показано графиком. В виде таблицы перечислены все значения.", + "dataUsed": "Использованы данные ({count})", + "truncated": "Показаны последние {shown} из {total} строк", + "withheld": { + "moduleDisabled": "Эта таблица скрыта, потому что её модуль выключен.", + "unavailable": "Эту таблицу не удалось загрузить." + }, + "loading": "Загрузка таблицы…", + "loadFailed": "Не удалось загрузить таблицы.", + "reusedFrom": "Из более раннего ответа ({date})", + "reusedFromUndated": "Из более раннего ответа", + "histogramBin": "{from}–{to} {unit}" + }, + "method": { + "label": "Как это вычислено", + "entry": "{domain}, {window}: {detail}", + "entryNoWindow": "{domain}: {detail}", + "reused": "из более раннего ответа", + "readingsOne": "1 измерение", + "readingsFew": "Измерений: {count}", + "readingsOther": "Измерений: {count}", + "aggregation": { + "mean": "среднее", + "median": "медиана", + "latest": "последнее измерение", + "sum": "сумма", + "count": "количество", + "rate": "доля" + }, + "averages": { + "day": "средние по дням", + "week": "средние по неделям", + "month": "средние по месяцам" + }, + "totals": { + "day": "итоги по дням", + "week": "итоги по неделям", + "month": "итоги по месяцам" + }, + "absent": { + "noData": "нет измерений", + "outsideWindow": "нет измерений в этом окне", + "moduleDisabled": "выключено" + } + }, + "followUp": { + "groupLabel": "Предлагаемые продолжения", + "widenWindow": "Посмотреть дальше назад", + "previousPeriod": "Сравнить с предыдущим периодом", + "yearAgo": "Сравнить с годом ранее", + "asChart": "Показать графиком", + "asTable": "Показать таблицей", + "relatedMetric": "См. также: {metric}", + "continue": "Продолжить поиск", + "settingLabel": "Предлагать продолжения", + "settingHint": "Показывать до трёх предложений продолжения под последним ответом Коуча.", + "changeAssumption": "Вместо: {value}" + }, + "clarify": { + "cardLabel": "У Коуча есть вопрос", + "choicesLabel": "Возможные ответы", + "freeTextHint": "Вы также можете ввести свой ответ.", + "contextHint": "Введите ответ ниже.", + "window": { + "last7days": "Последние 7 дней", + "last30days": "Последние 30 дней", + "last90days": "Последние 90 дней", + "lastYear": "Последние 12 месяцев", + "allTime": "За всё время" + }, + "comparison": { + "baseline90d": "Сравнить с моими обычными 90 днями" + }, + "anchor": { + "illness": "С момента заболевания {date}" + } + }, + "reuse": { + "caption": "Вот те же цифры из моего прошлого ответа, без изменений." + } + }, + "safety": { + "floor": { + "bpHighTitle": "Очень высокое АД", + "bpHighDoctor": "Два последних измерения были {systolic}/{diastolic} мм рт. ст. или выше. Отдохните, перепроверьте через несколько минут и как можно скорее обратитесь к врачу, если АД останется таким высоким.", + "bpHighEmergency": "Два последних измерения были {systolic}/{diastolic} мм рт. ст. или выше, и вы отметили симптомы. Если у вас боль в груди, одышка, слабость или изменения зрения или речи, немедленно вызывайте скорую помощь.", + "bpLowTitle": "Низкое АД", + "bpLowDoctor": "При двух последних измерениях систолическое было ниже {systolic} мм рт. ст. Если вы чувствуете головокружение или слабость, сядьте или лягте, и обратитесь к врачу, если это продолжится.", + "bpLowEmergency": "При двух последних измерениях систолическое было ниже {systolic} мм рт. ст., и вы отметили симптомы. Если вы чувствуете слабость, спутанность сознания или у вас холодная липкая кожа, немедленно вызывайте скорую помощь.", + "glucoseLowTitle": "Низкий сахар в крови", + "glucoseLowDoctor": "Два последних измерения были ниже {threshold} {unit} ({value} {unit}). Примите быстроусваиваемые углеводы, перепроверьте через 15 минут и обратитесь к врачу, если низкие значения продолжатся.", + "glucoseLowEmergency": "Два последних измерения были ниже {threshold} {unit} ({value} {unit}), и вы отметили симптомы. Сейчас же примите быстроусваиваемый сахар; если не можете или чувствуете себя очень плохо, вызывайте скорую помощь.", + "glucoseLowSevereTitle": "Очень низкий сахар в крови", + "glucoseLowSevereDoctor": "Два последних измерения были ниже {threshold} {unit} ({value} {unit}). Немедленно примите быстроусваиваемые углеводы, перепроверьте через 15 минут и обратитесь к врачу.", + "glucoseLowSevereEmergency": "Два последних измерения были ниже {threshold} {unit} ({value} {unit}), и вы отметили симптомы. Примите сахар сейчас; если не можете удержать еду или чувствуете себя очень плохо, вызывайте скорую помощь.", + "glucoseHighTitle": "Очень высокий сахар в крови", + "glucoseHighDoctor": "Два последних измерения были {value} {unit} или выше. Перепроверьте, пейте воду и как можно скорее обратитесь к врачу, если сахар останется таким высоким.", + "glucoseHighEmergency": "Два последних измерения были {value} {unit} или выше, и вы отметили симптомы. Если у вас рвота, учащённое дыхание или спутанность сознания, немедленно вызывайте скорую помощь." + } + }, + "version": { + "updateAvailable": { + "title": "Доступна новая версия", + "reload": "Перезагрузить", + "dismiss": "Закрыть" + } + }, + "mentalHealth": { + "pageTitle": "Психическое благополучие", + "pageDescription": "Четыре проверенных добровольных самоопросника. Динамика во времени говорит больше, чем любой отдельный балл.", + "attributionLabel": "Атрибуция", + "attributionShow": "Источник и лицензия для {instrument}", + "choosePrompt": "Выберите опросник", + "start": "Начать", + "back": "Назад", + "submit": "Показать результат", + "submitting": "Сохранение…", + "saved": "Сохранено", + "error": "Что-то пошло не так. Попробуйте ещё раз.", + "instrument": { + "phq9": "PHQ-9 (настроение)", + "gad7": "GAD-7 (тревога)", + "who5": "WHO-5 (благополучие)", + "sci": "SCI (сон)" + }, + "instrumentSub": { + "phq9": "Скрининг депрессии, 9 вопросов", + "gad7": "Скрининг тревожности, 7 вопросов", + "who5": "Проверка благополучия, 5 вопросов", + "sci": "Проверка сна, 8 вопросов" + }, + "functionalOptionalHint": "Необязательно: можно отправить, не отвечая на этот вопрос.", + "result": { + "title": "Ваш результат", + "totalLabel": "Общий балл", + "bandLabel": "Диапазон для этого опросника", + "takeAnother": "Пройти другой опросник", + "scoreOf": "из {max}", + "firstCheckIn": "Это ваш первый результат по этому опроснику. Начиная со следующего здесь будет показываться изменение.", + "nextStep": "Вы можете повторить этот опросник через две недели или позже, чтобы отследить изменение. Если что-то вас беспокоит, в любой момент обратитесь к специалисту." + }, + "band": { + "PHQ9": { + "minimal": "Нет / минимальные", + "mild": "Лёгкие", + "moderate": "Умеренные", + "modSevere": "Умеренно тяжёлые", + "severe": "Тяжёлые" + }, + "GAD7": { + "minimal": "Нет / минимальная", + "mild": "Лёгкая", + "moderate": "Умеренная", + "severe": "Тяжёлая" + }, + "WHO5": { + "low": "Пониженное благополучие", + "good": "Хорошее благополучие" + }, + "SCI": { + "belowThreshold": "Возможный диапазон бессонницы", + "aboveThreshold": "Признаков бессонницы нет" + } + }, + "history": { + "title": "Ваша история", + "empty": "Опросников пока нет. Ваша динамика появится здесь после первого прохождения.", + "flaggedBadge": "Показана поддержка", + "chartTitle": "Динамика баллов", + "totalLabel": "Балл", + "bandLabel": "Категория", + "answersToggle": "Ответы", + "answersUnavailable": "Сохранённые ответы этого опросника не удаётся расшифровать." + }, + "crisis": { + "title": "Вам не обязательно справляться с этим в одиночку", + "intro": "Вы указали мысли о том, что вам было бы лучше умереть или что вы хотели бы причинить себе вред. Поддержка доступна прямо сейчас, и обратиться за ней — признак силы.", + "ifDanger": "Если вы в непосредственной опасности, немедленно звоните {emergency}.", + "resourcesTitle": "Кто может помочь" + }, + "crisisResource": { + "telefonSeelsorge": { + "name": "TelefonSeelsorge (круглосуточно, бесплатно, конфиденциально)" + }, + "nummerGegenKummer": { + "name": "Nummer gegen Kummer (для молодёжи)" + }, + "telefonSeelsorgeAt": { + "name": "Telefonseelsorge Österreich (круглосуточно, бесплатно, конфиденциально)" + }, + "dargeboteneHand": { + "name": "Die Dargebotene Hand (круглосуточно, бесплатно, конфиденциально)" + }, + "krisenchat": { + "name": "krisenchat (чат круглосуточно, для молодёжи)" + }, + "findahelpline": { + "name": "Find a helpline (всемирный справочник)" + }, + "euEmotionalSupport": { + "name": "Линия эмоциональной поддержки" + }, + "lifeline988": { + "name": "988 Suicide & Crisis Lifeline" + }, + "crisisTextLine": { + "name": "Crisis Text Line" + }, + "cvv": { + "name": "CVV, Centro de Valorização da Vida (Бразилия, круглосуточно, бесплатно, конфиденциально)" + }, + "samu": { + "name": "SAMU, служба скорой медицинской помощи (Бразилия)" + }, + "sns24": { + "name": "SNS 24, психологическое консультирование (Португалия, круглосуточно, выберите вариант 4)" + }, + "sosVozAmiga": { + "name": "SOS Voz Amiga (Португалия, ежедневно с 15:30 до 00:30)" + }, + "zelfmoordpreventie113": { + "name": "113 Zelfmoordpreventie (Нидерланды, круглосуточно, бесплатно, анонимно, также в чате)" + }, + "zelfmoordlijn1813": { + "name": "Zelfmoordlijn 1813 (Бельгия, круглосуточно, бесплатно, анонимно)" + } + }, + "instrumentDescription": { + "phq9": "Скрининг депрессии из 9 вопросов. Отвечайте за последние две недели.", + "gad7": "Скрининг тревожности из 7 вопросов. Отвечайте за последние две недели.", + "who5": "Проверка благополучия из 5 вопросов. Отвечайте за последние две недели; более высокие числа означают лучшее благополучие.", + "sci": "Проверка сна из 8 вопросов. Большинство вопросов касаются последнего месяца; более высокие баллы означают лучший сон." + }, + "next": "Далее", + "lastResult": "Последний тест", + "lastScore": "Последний результат", + "noResultYet": "Опросников пока нет", + "backToList": "Обзор", + "followUpHint": { + "phq9": "Ваш балл находится в диапазоне, где разговор со специалистом может помочь. Это мягкая рекомендация, а не диагноз.", + "gad7": "Ваш балл находится в диапазоне, где разговор со специалистом может помочь. Это мягкая рекомендация, а не диагноз.", + "who5": "Балл благополучия 50 или ниже может стоить более внимательного взгляда. При желании опросник PHQ-9 на этой странице подробнее рассматривает настроение. Это мягкая рекомендация, а не диагноз.", + "sci": "В исследовании, лежащем в основе этого опросника, баллы 16 или ниже были связаны с вероятной бессонницей. Если плохой сон продолжает вас беспокоить, разговор со специалистом может помочь. Это не диагноз." + }, + "openDetail": "Показать подробности", + "historyLoadError": "Не удалось загрузить историю ваших опросников", + "historyLoadErrorHint": "Это не значит, что у вас нет результатов; список не удалось получить. Попробуйте ещё раз.", + "privacyNote": "Ваши ответы хранятся в зашифрованном виде и никогда не попадают к Коучу на ИИ.", + "trend": { + "sincePrevious": "С вашего предыдущего опросника {date}: {change} баллов.", + "sinceFirst": "С вашего первого опросника {date}: {change} баллов.", + "verdict": { + "improved": "Это достигает изменения в {threshold} баллов, которое исследования считают значимым, в лучшую сторону.", + "worsened": "Это достигает изменения в {threshold} баллов, которое исследования считают значимым, в менее хорошую сторону.", + "within_threshold": "Это меньше изменения в {threshold} баллов, которое исследования считают значимым." + } + }, + "wizard": { + "progressLabel": "Вопрос {current} из {total}", + "followUpLabel": "Уточняющий вопрос (необязательно)", + "keyboardHint": "Цифровые клавиши от 1 до {count} выбирают ответ.", + "allAnswered": "Отвечено на все вопросы: {total}" + }, + "review": { + "title": "Проверьте свои ответы", + "description": "Ничего не сохраняется до отправки, и каждый ответ ещё можно изменить.", + "change": "Изменить", + "changeLabel": "Изменить ответ на вопрос {number}", + "notAnswered": "Без ответа", + "open": "Проверить ответы" + }, + "bandMeaning": { + "PHQ9": { + "minimal": "Ваши ответы указывают на малое число симптомов депрессии или их отсутствие за последние две недели.", + "mild": "Ваши ответы указывают на лёгкие симптомы депрессии за последние две недели.", + "moderate": "Ваши ответы указывают на умеренные симптомы депрессии за последние две недели.", + "modSevere": "Ваши ответы указывают на умеренно тяжёлые симптомы депрессии за последние две недели.", + "severe": "Ваши ответы указывают на тяжёлые симптомы депрессии за последние две недели." + }, + "GAD7": { + "minimal": "Ваши ответы указывают на малое число симптомов тревожности или их отсутствие за последние две недели.", + "mild": "Ваши ответы указывают на лёгкие симптомы тревожности за последние две недели.", + "moderate": "Ваши ответы указывают на умеренные симптомы тревожности за последние две недели.", + "severe": "Ваши ответы указывают на тяжёлые симптомы тревожности за последние две недели." + }, + "WHO5": { + "low": "Ваше благополучие за последние две недели было ниже диапазона, который WHO-5 считает хорошим.", + "good": "Ваше благополучие за последние две недели было в диапазоне, который WHO-5 считает хорошим." + }, + "SCI": { + "belowThreshold": "Ваш сон за последний месяц был в диапазоне, где исследование, лежащее в основе этого опросника, обнаружило вероятную бессонницу.", + "aboveThreshold": "Ваш сон за последний месяц был вне диапазона, который то исследование связывало с бессонницей." + } + }, + "wording": { + "unvalidatedNote": "Этот перевод не прошёл научную валидацию; воспринимайте результат как ориентир.", + "showOriginal": "Показать оригинальную английскую формулировку", + "showTranslation": "Показать перевод", + "resultUnvalidated": "Ответы даны в переводе, не прошедшем научную валидацию; воспринимайте результат как ориентир.", + "historyUnvalidated": "Ответы даны в переводе, не прошедшем научную валидацию" + } + }, + "records": { + "aiInclusion": { + "cardTitle": "Доступ ИИ к профилю", + "cardDescription": "Выберите, какие части вашего профиля здоровья могут использовать Коуч и подробные брифинги.", + "sectionAboutMe": "Обо мне", + "sectionConditions": "Хронические состояния", + "sectionAllergies": "Аллергии и непереносимости", + "sectionCoachFocus": "Фокус Коуча", + "sectionFamilyHistory": "Семейный анамнез", + "sectionSmoking": "Статус курения", + "sectionAlcohol": "Характер употребления алкоголя", + "sectionShiftSchedule": "График работы", + "save": "Сохранить доступ", + "savedToast": "Доступ ИИ к профилю сохранён", + "saveError": "Не удалось сохранить доступ ИИ к профилю", + "loadError": "Не удалось загрузить доступ ИИ к профилю" + }, + "profileFacts": { + "cardTitle": "Контекст образа жизни", + "smokingLabel": "Статус курения", + "alcoholLabel": "Характер употребления алкоголя", + "shiftLabel": "График работы", + "notRecorded": "Не записано", + "remove": "Убрать {kind}", + "values": { + "SMOKING_STATUS": { + "NEVER": "Никогда не курил", + "FORMER": "Бывший курильщик", + "CURRENT": "Курит сейчас" + }, + "ALCOHOL_PATTERN": { + "NONE": "Нет", + "OCCASIONAL": "Изредка", + "WEEKLY": "Еженедельно", + "MOST_DAYS": "Большинство дней" + }, + "SHIFT_SCHEDULE": { + "NONE": "Без сменной работы", + "FIXED_SHIFT": "Фиксированная смена", + "ROTATING": "Сменный график" + } + } + }, + "disclaimer": "Это ваши собственные записи, а не медицинский диагноз. HealthLog не ставит диагноз, не лечит и не интерпретирует их.", + "allergies": { + "cardTitle": "Аллергии и непереносимости", + "cardDescription": "Вещества, на которые вы реагируете, с реакцией и её тяжестью.", + "description": "Записать аллергию или непереносимость.", + "add": "Добавить аллергию", + "addFirst": "Добавьте первую аллергию", + "addTitle": "Добавить аллергию", + "editTitle": "Изменить аллергию", + "formDescription": "Вещество хранится открытым текстом; реакция и заметка зашифрованы.", + "emptyTitle": "Аллергии не записаны", + "emptyDescription": "Добавьте вещества, на которые вы реагируете, и их реакции.", + "loadError": "Не удалось загрузить ваши аллергии.", + "deletedToast": "Аллергия удалена", + "deleteError": "Не удалось удалить аллергию.", + "deleteConfirmTitle": "Удалить эту аллергию?", + "deleteConfirmDescription": "Запись будет удалена. Это нельзя отменить.", + "category": { + "FOOD": "Пища", + "MEDICATION": "Лекарство", + "ENVIRONMENT": "Окружающая среда", + "BIOLOGIC": "Биологический агент", + "OTHER": "Другое" + }, + "type": { + "ALLERGY": "Аллергия", + "INTOLERANCE": "Непереносимость" + }, + "severity": { + "NONE": "Не оценено", + "MILD": "Лёгкая", + "MODERATE": "Умеренная", + "SEVERE": "Тяжёлая" + }, + "status": { + "ACTIVE": "Активно", + "INACTIVE": "Неактивно", + "RESOLVED": "Прошло" + }, + "form": { + "substance": "Вещество", + "substancePlaceholder": "например, пенициллин, арахис", + "category": "Категория", + "type": "Тип", + "severity": "Тяжесть", + "status": "Статус", + "onset": "Когда впервые замечено", + "reaction": "Реакция", + "reactionPlaceholder": "например, крапивница, отёк, анафилаксия", + "note": "Заметка", + "notePlaceholder": "Что ещё стоит запомнить", + "requiredError": "Введите вещество.", + "savedToast": "Аллергия сохранена", + "updatedToast": "Аллергия обновлена", + "saveError": "Не удалось сохранить аллергию." + }, + "freeText": { + "label": "Заметка свободным текстом (аллергии и непереносимости)", + "hint": "Дополнение свободным текстом к структурированному списку выше, для контекста, который не вмещает одна запись.", + "savedToast": "Заметка об аллергии сохранена", + "saveError": "Не удалось сохранить. Попробуйте ещё раз." + } + }, + "family": { + "cardTitle": "Семейный анамнез", + "cardDescription": "Заболевания у ваших родственников, одна запись на заболевание.", + "description": "Записать заболевание у родственника.", + "add": "Добавить запись", + "addFirst": "Добавьте первую запись", + "addTitle": "Добавить семейный анамнез", + "editTitle": "Изменить семейный анамнез", + "formDescription": "Родство и заболевание хранятся открытым текстом; заметка зашифрована.", + "emptyTitle": "Семейный анамнез не записан", + "emptyDescription": "Добавьте заболевания, которые встречаются в вашей семье.", + "loadError": "Не удалось загрузить ваш семейный анамнез.", + "deletedToast": "Запись удалена", + "deleteError": "Не удалось удалить запись.", + "deleteConfirmTitle": "Удалить эту запись?", + "deleteConfirmDescription": "Запись будет удалена. Это нельзя отменить.", + "ageAtOnsetShort": "Возраст {age}", + "relationship": { + "MOTHER": "Мать", + "FATHER": "Отец", + "SISTER": "Сестра", + "BROTHER": "Брат", + "DAUGHTER": "Дочь", + "SON": "Сын", + "GRANDMOTHER_MATERNAL": "Бабушка (по матери)", + "GRANDFATHER_MATERNAL": "Дедушка (по матери)", + "GRANDMOTHER_PATERNAL": "Бабушка (по отцу)", + "GRANDFATHER_PATERNAL": "Дедушка (по отцу)", + "AUNT": "Тётя", + "UNCLE": "Дядя", + "COUSIN": "Двоюродный брат или сестра", + "HALF_SIBLING": "Сводный брат или сестра", + "OTHER": "Другой родственник" + }, + "form": { + "relationship": "Родственник", + "condition": "Заболевание", + "conditionPlaceholder": "например, сахарный диабет 2-го типа, рак молочной железы", + "ageAtOnset": "Возраст начала", + "ageAtOnsetPlaceholder": "например, 55", + "note": "Заметка", + "notePlaceholder": "Что ещё стоит запомнить", + "requiredError": "Введите заболевание.", + "ageError": "Введите возраст от 0 до 120.", + "savedToast": "Запись сохранена", + "updatedToast": "Запись обновлена", + "saveError": "Не удалось сохранить запись." + } + }, + "conditions": { + "cardTitle": "Сопутствующие заболевания", + "cardDescription": "Хронические заболевания и то, за чем следит Coach.", + "conditionsLabel": "Хронические заболевания", + "focusLabel": "За чем следит Coach", + "loadError": "Не удалось загрузить ваши заболевания.", + "savedToast": "Заболевания сохранены", + "saveError": "Не удалось сохранить. Попробуйте ещё раз." + }, + "emergency": { + "cardTitle": "Экстренная информация", + "cardDescription": "Что нужно в первую очередь: группа крови, контакты, распоряжения.", + "bloodType": "Группа крови", + "organDonor": "Донор органов", + "advanceDirective": "Заранее данное распоряжение", + "contacts": "Экстренные контакты", + "implants": "Импланты и устройства", + "note": "Дополнительные заметки", + "notRecorded": "Не записано", + "bloodTypeValues": { + "A_POS": "A положительная", + "A_NEG": "A отрицательная", + "B_POS": "B положительная", + "B_NEG": "B отрицательная", + "AB_POS": "AB положительная", + "AB_NEG": "AB отрицательная", + "O_POS": "O положительная", + "O_NEG": "O отрицательная", + "UNKNOWN": "Неизвестно" + }, + "organDonorValues": { + "YES": "Да", + "NO": "Нет", + "UNKNOWN": "Не указано" + }, + "advanceDirectiveValues": { + "EXISTS": "Есть", + "NONE": "Нет", + "UNKNOWN": "Не указано" + }, + "contactsPlaceholder": "Имя и номер телефона, кому звонить", + "implantsPlaceholder": "Например, кардиостимулятор, инсулиновая помпа, металлический имплант", + "notePlaceholder": "Что врач должен знать в экстренной ситуации", + "reportHint": "Это отображается на первой странице отчёта для врача.", + "save": "Сохранить", + "savedToast": "Экстренная информация сохранена", + "saveError": "Не удалось сохранить экстренную информацию.", + "loadError": "Не удалось загрузить экстренную информацию." + }, + "life": { + "cardTitle": "Жизненные обстоятельства", + "cardDescription": "Курение, алкоголь, активность, работа, привычки и цели — с датами и всё необязательно.", + "loadError": "Не удалось загрузить ваши жизненные обстоятельства.", + "noAnswer": "Нет ответа", + "yes": "Да", + "no": "Нет", + "validSince": "Действует с", + "month": "Месяц", + "year": "Год", + "lastConfirmed": "Последнее подтверждение {date}", + "notAnswered": "Пока без ответа", + "unreadable": "Этот ответ нельзя прочитать на этом сервере.", + "save": "Сохранить раздел", + "savedToast": "Раздел сохранён", + "saveError": "Не удалось сохранить раздел.", + "review": { + "question": "Это всё ещё так? Ваш последний ответ старше года.", + "confirm": "Всё ещё так", + "confirmedToast": "Спасибо, отмечено как всё ещё верное", + "confirmError": "Не удалось сохранить подтверждение." + }, + "ai": { + "label": "Поделиться этим разделом с ИИ", + "shiftLabel": "Поделиться сменной работой с ИИ", + "hint": "Выключено — Coach и сводки никогда не видят эти ответы.", + "savedToast": "Доступ ИИ обновлён", + "saveError": "Не удалось сохранить настройку ИИ." + }, + "sections": { + "tobacco": { + "title": "Курение и никотин" + }, + "alcohol": { + "title": "Алкоголь" + }, + "activity": { + "title": "Активность и сидение" + }, + "work": { + "title": "Работа и ритм" + }, + "habits": { + "title": "Сон, питание и кофеин" + }, + "goals": { + "title": "Цели" + } + }, + "fields": { + "smokingStatus": "Статус курения", + "products": "Что используется", + "cigarettesPerDay": "Сигарет в день", + "startYear": "Год начала", + "quitMonth": "Когда вы бросили", + "secondhandSmoke": "Регулярное пассивное курение", + "moderateDaysPerWeek": "Дней в неделю с умеренной или интенсивной активностью, например быстрой ходьбой", + "moderateMinutesPerDay": "Минут в такие дни, в среднем", + "sittingHoursWorkday": "Часов сидения в рабочий день", + "shiftSchedule": "Сменная работа", + "situation": "Рабочая ситуация", + "physicalNature": "Характер работы", + "nightWork": "Ночная работа", + "exposures": "Воздействия на работе", + "freeWeekdays": "Свободные дни недели", + "napRegularly": "Регулярный дневной сон", + "snoringReported": "Другие говорят, что вы храпите", + "dietPattern": "Питание", + "dietSpecifics": "Особенности", + "lateMealsPerWeek": "Приёмов пищи после 21:00 в неделю", + "fruitVegPortionsPerDay": "Порций фруктов и овощей в день", + "caffeineDrinksPerDay": "Напитков с кофеином в день", + "latestCaffeine": "Последний кофеин за день", + "goals": "Над чем вы хотите работать", + "goalsHint": "До трёх." + }, + "values": { + "products": { + "cigarettes": "Сигареты", + "cigars_pipe": "Сигары или трубка", + "e_cigarette": "Электронная сигарета", + "heated_tobacco": "Нагреваемый табак", + "snus_pouches": "Снюс или никотиновые пакетики" + }, + "situation": { + "none": "Не работает по найму", + "indoor": "В основном в помещении", + "outdoor": "В основном на улице", + "mixed": "В помещении и на улице" + }, + "physicalNature": { + "mostly_sitting": "В основном сидя", + "standing_walking": "Стоя или в движении", + "heavy_physical": "Тяжёлый физический труд" + }, + "exposures": { + "heat": "Жара", + "cold": "Холод", + "dust": "Пыль", + "fumes_solvents": "Пары или растворители", + "noise": "Шум" + }, + "dietPattern": { + "mixed": "Смешанное питание", + "vegetarian": "Вегетарианское", + "vegan": "Веганское", + "pescetarian": "Пескетарианское", + "other": "Другое" + }, + "dietSpecifics": { + "intermittent_fasting": "Интервальное голодание", + "low_carb": "Низкоуглеводное", + "prescribed_diet": "Диета, назначенная врачом" + }, + "latestCaffeine": { + "before_12": "До полудня", + "12_15": "С полудня до 15:00", + "15_18": "С 15:00 до 18:00", + "after_18": "После 18:00" + }, + "goals": { + "weight": "Вес", + "blood_pressure": "АД", + "blood_sugar": "Сахар в крови", + "sleep": "Сон", + "fitness": "Фитнес", + "stress_recovery": "Стресс и восстановление", + "medication_routine": "Регулярный приём лекарств", + "quit_smoking": "Бросить курить", + "less_alcohol": "Меньше алкоголя" + }, + "weekdays": { + "1": "Пн", + "2": "Вт", + "3": "Ср", + "4": "Чт", + "5": "Пт", + "6": "Сб", + "7": "Вс" + } + }, + "derived": { + "packYears": "{value} пачко-лет", + "packYearsMissing": "Для пачко-лет нужны сигареты в день и год начала.", + "activityMinutes": "{value} минут в неделю.", + "meetsWho": "Это соответствует рекомендации ВОЗ в 150 минут в неделю.", + "belowWho": "Это ниже рекомендации ВОЗ в 150 минут в неделю.", + "measuredSteps": "Измеренные шаги важнее; этот ответ добавляет контекст.", + "freeDaysDefault": "Без ответа суббота и воскресенье считаются свободными днями." + }, + "auditC": { + "intro": "Три вопроса об алкоголе из опросника AUDIT ВОЗ. Скрининг, а не диагноз.", + "start": "Ответить на вопросы", + "again": "Ответить снова", + "offerDue": "Достаточно быстрого взгляда раз в год.", + "notValidated": "Для вашего языка пока нет валидированного перевода, поэтому вопросы показаны на английском.", + "submit": "Сохранить ответы", + "savedToast": "Ответы сохранены", + "saveError": "Не удалось сохранить ответы.", + "result": "{score} из 12 баллов", + "above": "На уровне порога скрининга {cutoff} или выше.", + "below": "Ниже порога скрининга {cutoff}.", + "noCutoff": "Без пола в профиле показывается только сумма.", + "source": "Источник: {source}", + "history": "Более ранние записи", + "remove": "Убрать запись", + "removeConfirmTitle": "Убрать эту запись?", + "removeConfirmBody": "Запись исчезнет из вашей истории. Здесь это нельзя отменить.", + "removedToast": "Запись убрана", + "removeError": "Не удалось убрать запись.", + "historyEntry": "{date}: {score} из 12", + "legacyLabel": "Более ранний ответ: {value}", + "legacyHint": "Из короткого вопроса об алкоголе, заданного до этого опросника. Как только в записи есть результат опросника, Coach его больше не читает.", + "legacyRemove": "Убрать более ранний ответ", + "legacyRemoveConfirmTitle": "Убрать более ранний ответ?", + "legacyRemoveConfirmBody": "Более ранний ответ исчезнет из вашей записи. Результаты опросника остаются.", + "legacyRemovedToast": "Более ранний ответ убран", + "legacyRemoveError": "Не удалось убрать более ранний ответ." + }, + "takeOver": { + "conditionsButton": "Добавить в журнал заболеваний", + "allergiesButton": "Добавить в аллергии", + "conditionsTitle": "Добавить хроническое заболевание", + "allergiesTitle": "Добавить аллергию", + "description": "Ваш свободный текст остаётся как есть, пока вы сами его не очистите.", + "freeTextLabel": "Ваш свободный текст", + "conditionLabel": "Заболевание", + "onset": "С", + "save": "Добавить", + "savedToast": "Запись добавлена", + "saveError": "Не удалось добавить запись.", + "clearQuestion": "Запись сохранена. Очистить свободный текст сейчас?", + "clear": "Очистить свободный текст", + "keep": "Оставить", + "clearedToast": "Свободный текст очищен", + "clearError": "Не удалось очистить свободный текст." + }, + "screening": { + "cardTitle": "Подсказки по скринингу", + "cardDescription": "Из ваших жизненных обстоятельств, с правилом и страной его происхождения.", + "noReminder": "Это только подсказка; поставьте напоминание сами, если хотите.", + "source": "Источник: {source}", + "titles": { + "lung_ldct": "Низкодозная КТ для скрининга рака лёгких", + "aaa_ultrasound": "УЗИ брюшной аорты" + }, + "status": { + "suggested": "Может относиться к вам", + "not_eligible": "Не относится к вам", + "unknown": "Недостаточно информации" + }, + "reasons": { + "never_smoked": "Вы никогда не курили.", + "missing_birth_date": "Не указана дата рождения.", + "age_out_of_range": "Ваш возраст вне диапазона.", + "missing_smoking_status": "Не указан статус курения.", + "no_cigarettes": "Правило учитывает только сигареты.", + "missing_smoking_history": "Не указаны сигареты в день или год начала.", + "pack_years_below_15": "Меньше 15 пачко-лет.", + "pack_years_below_20": "Меньше 20 пачко-лет.", + "smoked_years_below_25": "Меньше 25 лет курения.", + "missing_quit_date": "Не указана дата, когда вы бросили.", + "quit_over_10_years": "Вы бросили более 10 лет назад.", + "quit_over_15_years": "Вы бросили более 15 лет назад.", + "missing_sex": "В профиле не указан пол.", + "sex_not_male": "Правило относится к мужчинам." + } + } + } + }, + "environment": { + "fields": { + "tempMean": "Температура за день", + "tempMin": "Ночной минимум", + "sunshine": "Солнечный свет", + "daylight": "Дневной свет", + "precip": "Осадки", + "pressureMean": "Атмосферное давление", + "pressureDelta": "Перепад давления", + "pm25": "Мелкие частицы (PM2.5)", + "pm10": "Частицы (PM10)", + "no2": "Диоксид азота", + "ozone8h": "Озон (8-часовой максимум)", + "europeanAqi": "Европейский индекс качества воздуха", + "uvIndexMax": "УФ-индекс (максимум)", + "dustMax": "Сахарская пыль", + "pollenMax": "Пыльца (максимум)" + }, + "chip": { + "day": "Погода {date}", + "pollenHigh": "Высокая пыльца: {kinds}", + "hotNight": "Тёплая ночь", + "veryPoorAir": "Очень плохой воздух" + }, + "pollen": { + "alder": "ольха", + "birch": "берёза", + "grass": "злаки", + "mugwort": "полынь", + "olive": "олива", + "ragweed": "амброзия" + }, + "movement": { + "awayFromHome": "Время вне дома", + "distance": "Пройденное расстояние" + } + }, + "documents": { + "title": "Документы", + "subtitle": "Каждое письмо, отчёт и скан в одном месте с поиском, зашифрованы при хранении.", + "pageUpload": "Загрузить", + "ownerOnlyUpload": "Документы может добавлять только владелец записи.", + "kind": { + "DOCTOR_REPORT": "Отчёт для врача", + "DISCHARGE_LETTER": "Выписной эпикриз", + "OTHER": "Другое", + "LAB_RESULT": "Результат анализа", + "IMAGING": "Снимки", + "PRESCRIPTION": "Рецепт", + "REFERRAL": "Направление", + "INSURANCE": "Страховка", + "VACCINATION": "Вакцинация", + "SICK_NOTE": "Больничный лист" + }, + "filter": { + "searchLabel": "Поиск документов", + "searchPlaceholder": "Поиск по названию или имени файла…", + "typeGroup": "Тип документа", + "conditionGroup": "Заболевание", + "procedureGroup": "Процедуры и операции", + "yearGroup": "Год", + "clear": "Очистить фильтры", + "typeAll": "Все типы", + "typeCount": "{count} типов", + "conditionAll": "Все заболевания", + "procedureAll": "Все процедуры", + "yearAll": "Все годы" + }, + "card": { + "untitled": "Документ без названия", + "selectLabel": "Выбрать {title}", + "openLabel": "Открыть {title}", + "attachmentBadge": "Только скачивание", + "uploading": "Загрузка…", + "dismissFailed": "Убрать неудачную загрузку", + "processing": "Обработка…", + "ready": "Готово", + "deleteKey": "Удалить" + }, + "error": { + "fileTooLarge": "Этот файл больше лимита {maxSize}.", + "quotaExceeded": "Хранилище заполнено: использовано {used} из {quota}.", + "unsupportedType": "Этот тип файла не поддерживается.", + "purged": "Этот документ удалён навсегда и не может быть восстановлен.", + "duplicateExists": "Идентичный документ уже сохранён.", + "rateLimited": "Слишком много загрузок сейчас. Попробуйте через несколько минут.", + "generic": "Загрузка не удалась. Попробуйте ещё раз." + }, + "toast": { + "duplicate": "Уже сохранён. Существующий документ выделен.", + "deleted": "Документ удалён", + "restoreFailed": "Не удалось восстановить документ.", + "deletedHint": "Удалённые документы остаются в «Недавно удалённых» {days} дней." + }, + "timeline": { + "loadingMore": "Загрузка…", + "listLabel": "Хронология документов" + }, + "upload": { + "browse": "Выбрать файлы", + "quotaAlmostFull": "Хранилище почти заполнено", + "quotaUsed": "Использовано {used} из {quota}", + "queuedAnnouncement": "Файлов добавлено в очередь загрузки: {count}" + }, + "selection": { + "count": "Выбрано: {count}", + "clear": "Снять выделение" + }, + "list": { + "loadError": "Не удалось загрузить ваши документы." + }, + "empty": { + "title": "Ваше хранилище документов пусто", + "description": "Храните письма от врачей, результаты анализов, снимки, рецепты и записи о вакцинации. Они зашифрованы, и их можно искать по типу, заболеванию и году.", + "action": "Загрузить первый документ", + "noMatchesTitle": "Нет подходящих документов", + "noMatchesDescription": "Ничего не соответствует текущему поиску и фильтрам." + }, + "detail": { + "title": "Детали документа", + "summary": { + "title": "Сводка", + "pending": "Сводка готовится.", + "none": "Для этого документа ещё не создана сводка.", + "withheld": "Сводка была создана, но не прошла проверку безопасности, поэтому не показана. Можно попробовать снова или прочитать сам документ.", + "unavailable": "Для этого документа не удалось создать сводку.", + "generate": "Создать сводку", + "generating": "Создание…" + }, + "index": { + "outcome": { + "local-empty": "Читаемый текст не найден. Похоже на скан; его может прочитать провайдер ИИ с поддержкой изображений.", + "local-unsupported": "Этот тип файла нельзя прочитать для поиска.", + "decrypt-error": "Сохранённый файл не удалось открыть для чтения.", + "raster-failed": "Страницы PDF не удалось отрисовать для чтения. Известная причина — форматы сжатия сканированных факсов.", + "provider-error": "Провайдер ИИ не смог прочитать этот документ при последней попытке.", + "pdf-needs-anthropic": "Настроенный провайдер ИИ не может читать PDF-файлы. Это умеет провайдер Claude или локальный OCR.", + "empty-transcription": "Провайдер ИИ не вернул текст для этого документа.", + "resource-limit": "Этот PDF слишком большой или сложный для чтения здесь. Сам файл в порядке и по-прежнему открывается." + } + }, + "loadError": "Не удалось загрузить этот документ.", + "saveError": "Не удалось сохранить изменение.", + "deleteError": "Не удалось удалить документ.", + "download": "Скачать", + "openInNewTab": "Открыть в новой вкладке", + "delete": "Удалить", + "titleLabel": "Название", + "titlePlaceholder": "Добавить название", + "kindLabel": "Тип", + "dateLabel": "Дата документа", + "conditionsLabel": "Связанные заболевания", + "linkCondition": "Связать", + "noConditions": "Не связано с заболеванием", + "previewUnavailable": "Нет встроенного просмотра для этого типа файла", + "uploadedMeta": "Добавлено {date}, {size}", + "importedFrom": "Импортировано из {system}", + "importedFromWithId": "Импортировано из {system}, ID {id}", + "sourceOther": "другой системы", + "share": "Поделиться", + "labValuesLink": "Показать результаты анализов ({count})", + "visitsLabel": "Относится к визиту", + "vaccinationsLabel": "Вакцинации", + "noVisitsToLink": "Визиты ещё не записаны.", + "noVaccinationsToLink": "Вакцинации ещё не записаны." + }, + "dropOverlay": { + "title": "Перетащите файлы для загрузки", + "hint": "Они сохраняются зашифрованными в вашем хранилище документов" + }, + "bulk": { + "barLabel": "Действия для выбранных документов", + "setKind": "Изменить тип", + "linkCondition": "Связать заболевание", + "delete": "Удалить", + "updated": "Обновлено документов: {count}", + "deleted": "Удалено документов: {count}", + "restored": "Восстановлено документов: {count}", + "partialFailure": "Не удалось обновить {failed} из {total}", + "failed": "Не удалось выполнить действие", + "share": "Поделиться", + "shareTooMany": "Ссылка для общего доступа может содержать не более {max} документов. Снимите выделение с некоторых и попробуйте снова.", + "linkVisit": "Привязать к визиту" + }, + "episodeCard": { + "title": "Документы", + "link": "Связать", + "upload": "Загрузить", + "viewAll": "Показать все", + "emptyLine": "С этим заболеванием пока не связано ни одного документа.", + "loadError": "Не удалось загрузить связанные документы" + }, + "linkPicker": { + "title": "Связать документы", + "description": "Выберите из хранилища документы, относящиеся к этому заболеванию.", + "searchPlaceholder": "Поиск по названию или имени файла", + "empty": "Документы не найдены." + }, + "assist": { + "suggest": "Предложить детали", + "suggesting": "Чтение…", + "suggestedTitle": "Предложенное название", + "suggestedKind": "Предложенный тип", + "suggestedDate": "Предложенная дата", + "apply": "Применить", + "useTitle": "Использовать название", + "applied": "Применено", + "dismiss": "Закрыть", + "empty": "Из этого документа ничего не удалось прочитать.", + "unavailableBody": "Настройте провайдера ИИ, чтобы предлагать название, тип и дату.", + "unavailableLocalOcr": "Включите «Читать сканы на этом устройстве» в разделе Настройки → Модули → Анализы, чтобы читать изображения на этом устройстве.", + "unavailableAction": "Открыть настройки ИИ", + "errorGeneric": "Не удалось прочитать документ. Попробуйте ещё раз.", + "errorOcr": "Не удалось прочитать текст с этого изображения.", + "errorRateLimited": "Достигнут часовой лимит чтения с ИИ. Попробуйте позже.", + "errorRateLimitedWaitOne": "Достигнут часовой лимит чтения с ИИ. Попробуйте примерно через минуту.", + "errorRateLimitedWaitFew": "Достигнут часовой лимит чтения с ИИ. Попробуйте примерно через {count} минуты.", + "errorRateLimitedWaitOther": "Достигнут часовой лимит чтения с ИИ. Попробуйте примерно через {count} минут.", + "errorBudget": "Ваш бюджет ИИ на сегодня исчерпан.", + "errorPdfNeedsVision": "Для сканирования PDF нужен провайдер Claude с поддержкой изображений.", + "errorFileType": "Этот тип файла нельзя прочитать.", + "errorNotIndexed": "Сначала прочитайте документ, затем извлекайте.", + "errorOutputLimit": "Провайдер ИИ достиг лимита вывода, не вернув ни одного значения. Попробуйте модель, допускающую более длинные ответы.", + "errorLocalOcrDisabled": "Сначала включите «Читать сканы на этом устройстве» в разделе Настройки → Модули → Анализы.", + "errorProvider": "Для этого не настроен провайдер ИИ.", + "errorTextImageOnly": "Локальный OCR читает только изображения, а не этот файл.", + "errorConsent": "Для чтения документов с ИИ сначала нужно ваше согласие.", + "errorUnavailable": "Чтение документов с ИИ здесь сейчас недоступно.", + "unavailableLocalOcrAction": "Открыть настройки анализов" + }, + "summary": { + "summarise": "Сделать сводку", + "showText": "Показать извлечённый текст", + "summaryTitle": "Сводка", + "textTitle": "Извлечённый текст", + "close": "Скрыть" + }, + "ai": { + "readDone": "ИИ прочитал ваш документ.", + "readStagedOne": "ИИ прочитал ваш документ. 1 результат анализа готов к проверке.", + "readStagedFew": "ИИ прочитал ваш документ. Результатов анализов готово к проверке: {count}.", + "readStagedOther": "ИИ прочитал ваш документ. Результатов анализов готово к проверке: {count}.", + "read": "Прочитать с ИИ", + "reread": "Прочитать снова", + "reading": "Чтение…", + "notReadYet": "Этот документ ещё не прочитан." + }, + "review": { + "title": "Проверить извлечённые значения", + "hint": "Подтвердите то, что совпадает с документом. Неотмеченные значения отбрасываются; без вашего подтверждения ничего не сохраняется.", + "openOne": "Проверить извлечённое значение", + "openFew": "Проверить извлечённые значения ({count})", + "openOther": "Проверить извлечённые значения ({count})", + "includeAria": "Включить {value}", + "type": { + "OBSERVATION": "Результат анализа", + "CONDITION": "Заболевание", + "MEDICATION_STATEMENT": "Лекарство" + }, + "statedRange": "Указанный диапазон {range}", + "needsCheck": "Сверьте это значение с документом, затем сохраните его.", + "verify": "Проверить", + "verifySave": "Сохранить значение", + "verifyInvalid": "Введите название и либо числовое значение, либо текстовый результат, но не оба.", + "verifyFailed": "Не удалось сохранить исправление. Попробуйте ещё раз.", + "fieldName": "Название", + "fieldDate": "Дата", + "fieldValue": "Значение", + "fieldValueText": "Результат (текст)", + "fieldUnit": "Единица", + "fieldDose": "Доза", + "unverifiedNoteOne": "1 значение ещё нужно проверить, оно остаётся в ожидании.", + "unverifiedNoteFew": "Значений, которые ещё нужно проверить и которые остаются в ожидании: {count}.", + "unverifiedNoteOther": "Значений, которые ещё нужно проверить и которые остаются в ожидании: {count}.", + "finish": "Завершить проверку", + "confirmFailed": "Не удалось сохранить проверку. Попробуйте ещё раз.", + "savedToastOne": "1 значение сохранено", + "savedToastFew": "Сохранено значений: {count}", + "savedToastOther": "Сохранено значений: {count}", + "nothingSavedToast": "Проверка сохранена. Значения не добавлены.", + "extract": "Извлечь результаты анализов", + "extracting": "Извлечение…", + "extractHint": "Использует текст, уже прочитанный из этого документа. Извлечённые значения ждут вашей проверки; ничего не сохраняется автоматически.", + "extractEmpty": "Из этого документа не удалось извлечь значения.", + "extractIncomplete": "Часть документа не удалось прочитать полностью, поэтому некоторые значения могут отсутствовать. Сверьте список с документом.", + "failUnitRequired": "Числовому значению нужна единица, прежде чем его можно сохранить.", + "failUnitMismatch": "Указанная единица не совпадает с сохранённой единицей для этого показателя. Исправьте её, затем завершите проверку снова.", + "failGeneric": "Это значение не удалось сохранить.", + "failUnknownBiomarker": "Выбранный показатель больше не существует. Выберите другой." + }, + "contentIndex": { + "indexPrompt": "Сделать содержимое документов доступным для поиска.", + "indexAll": "Проиндексировать все для поиска", + "indexAllPending": "Запуск…", + "indexAllQueued": "Индексирование документов в фоне: {count}.", + "indexAllNothing": "Всё уже проиндексировано.", + "indexAllError": "Не удалось запустить индексирование." + }, + "share": { + "title": "Поделиться этим документом", + "multiTitle": "Поделиться этими документами", + "multiLabel": "Документов: {count}", + "description": "Создайте ссылку только для чтения для врача с этим документом. Ссылка и её парольная фраза показываются один раз." + }, + "chat": { + "title": "Чат об этом документе", + "openButton": "Спросить Coach" + }, + "readingConsent": { + "body": "Чтение с ИИ отправляет это в ваш сервис ИИ за пределами этого сервера. Разрешить HealthLog отправлять документы, результаты анализов и описания лекарств для чтения?", + "grant": "Разрешить чтение", + "error": "Не удалось сохранить согласие. Попробуйте ещё раз." + }, + "sourcePicker": { + "open": "Импорт из архива", + "openNamed": "Импорт из {name}", + "title": "Импорт из {name}", + "description": "Найдите по названию, затем отметьте документы, которые HealthLog должен скопировать.", + "sourceLabel": "Архив", + "searchLabel": "Название документа", + "searchPlaceholder": "Поиск по названию", + "tagLabel": "Тег", + "tagAny": "Любой тег", + "fromLabel": "С", + "toLabel": "По", + "clearFilters": "Очистить тег и даты", + "rangeInvalid": "Дата окончания раньше даты начала.", + "empty": "В {name} нет документов для показа.", + "noMatch": "Нет подходящих документов.", + "loadMore": "Показать ещё", + "stateImported": "В HealthLog", + "stateDeleted": "Удалён в HealthLog", + "stateInTrash": "В «Недавно удалённых»", + "selectedCount": "Выбрано {count} из максимум {max}", + "importAction": "Импортировать {count}", + "importing": "Импорт, по одному документу за раз…", + "done": "Готово", + "summary": "Импортировано: {imported}. Уже есть: {present}. Не импортировано: {failed}.", + "stopped": "Остановлено: {reason}", + "result": { + "waiting": "Ожидание", + "working": "Импорт…", + "imported": "Импортировано", + "importedLinked": "Импортировано и связано", + "duplicate": "Уже в HealthLog", + "duplicateLinked": "Уже в HealthLog, теперь связано", + "deleted": "Удалён в HealthLog, оставлен как есть", + "restored": "Восстановлено из «Недавно удалённых»", + "restoredLinked": "Восстановлено из «Недавно удалённых» и связано" + }, + "errors": { + "unavailable": "Архивы документов не включены на этом сервере.", + "notConnected": "Этот архив не подключён. Подключите его в разделе Настройки, Интеграции.", + "originNotAllowed": "Этот адрес отсутствует в списке разрешённых архивов сервера. Попросите администратора добавить его.", + "unreachable": "Не удалось связаться с архивом. Проверьте, что он запущен и адрес верный.", + "redirected": "Архив перенаправил запрос. Введите адрес, на который он перенаправляет.", + "authRefused": "Архив отклонил токен. Проверьте токен и его права.", + "versionTooOld": "Архив слишком старый. Нужен Paperless-ngx 2.16 или новее.", + "badResponse": "Ответ архива не удалось прочитать. Проверьте, что адрес указывает на сам архив.", + "notFound": "В архиве нет такого документа, либо id организации неверный или не ваш.", + "linkTargetNotFound": "Запись, к которой нужно привязать, больше не существует.", + "rateLimited": "Слишком много запросов. Подождите минуту и попробуйте снова.", + "browserOnly": "Архивы документов можно использовать только в браузере.", + "invalidAddress": "Введите полный адрес, начинающийся с https:// или http://.", + "organizationRequired": "Введите id организации Papra.", + "tokenRequired": "Введите токен API. Для нового адреса он нужен снова.", + "fileTooLarge": "Файл больше, чем принимает HealthLog.", + "quotaExceeded": "Ваше хранилище документов заполнено.", + "fileType": "HealthLog не принимает этот тип файла.", + "uploadLimit": "Достигнут часовой лимит загрузок. Попробуйте позже.", + "uploadBusy": "Другие загрузки ещё идут. Попробуйте через мгновение.", + "moduleDisabled": "Документы выключены в настройках.", + "generic": "Что-то пошло не так. Попробуйте ещё раз.", + "permissionMissing": "Ключ Papra не может читать теги. Дайте ему разрешение tags:read." + }, + "pickMore": "Выбрать ещё", + "finishedHint": "Найдите снова или измените фильтр, чтобы выбрать больше документов.", + "maxReached": "За один раз можно импортировать до {max} документов.", + "noMatchHint": "Попробуйте часть названия или очистите тег и даты." + }, + "customize": "Настроить вид", + "layout": { + "viewDescription": "Карточки с миниатюрами или компактный список.", + "arrangementHeading": "Расположение", + "arrangementDescription": "Каждый месяц отдельным блоком или всё сплошным потоком на всю ширину.", + "stacked": "Месяцы блоками", + "flow": "Сплошной поток", + "saveFailed": "Не удалось сохранить вид." + }, + "deleteConfirm": { + "titleOne": "Удалить этот документ?", + "titleMany": "Удалить документы ({count})?", + "body": "Удалённые документы остаются в «Недавно удалённых» {days} дней, затем удаляются навсегда.", + "action": "Удалить" + }, + "trash": { + "title": "Недавно удалённые", + "subtitle": "Удалённые документы остаются здесь {days} дней, затем удаляются навсегда.", + "back": "Документы", + "entryLabel": "Недавно удалённые ({count})", + "loadError": "Не удалось загрузить «Недавно удалённые».", + "emptyTitle": "В «Недавно удалённых» пусто", + "emptyDescription": "Удалённые документы ждут здесь {days} дней, прежде чем удалиться навсегда.", + "count": "Удалённые документы ({count})", + "restoreAll": "Восстановить все", + "restore": "Восстановить", + "purge": "Удалить сейчас", + "deletedOn": "Удалено {date}.", + "removesIn": "Будет удалено навсегда через {days} дней.", + "removesSoon": "Будет удалено навсегда в течение дня.", + "restored": "Документ восстановлен", + "openRestored": "Открыть", + "restoreDuplicate": "Идентичный документ уже сохранён, поэтому эту копию нельзя восстановить.", + "restorePartial": "Не удалось восстановить {failed} из {total}", + "purged": "Документ удалён навсегда", + "purgeFailed": "Не удалось удалить документ.", + "purgeConfirmTitle": "Удалить этот документ навсегда?", + "purgeConfirmBody": "Он будет удалён сейчас, а не в конце периода ожидания, и его нельзя будет восстановить." + } + }, + "selfDescription": { + "dataPosture": "HealthLog размещается у вас: ваши данные о здоровье хранятся в базе данных вашего собственного экземпляра. Заметки и другой свободный текст, документы, ответы на опросники, текст, написанный ИИ, и токены доступа зашифрованы при хранении; значения измерений, результаты анализов, названия лекарств и оценки настроения хранятся незашифрованными и полагаются на безопасность вашего сервера. Функции ИИ отправляют данные только провайдеру ИИ, настроенному для вашего аккаунта, и никакой сторонней аналитики по вашим данным о здоровье нет." + }, + "customMetrics": { + "sectionTitle": "Свои показатели", + "sectionSubtitle": "Измерения, которые вы определяете и отслеживаете сами.", + "add": "Добавить свой показатель", + "addValue": "Добавить значение", + "defineTitle": "Определить свой показатель", + "defineDescription": "Назовите измерение, задайте его единицу и, при желании, целевой диапазон.", + "editTitle": "Изменить свой показатель", + "edit": "Изменить", + "delete": "Удалить", + "deleteConfirmTitle": "Удалить этот свой показатель?", + "deleteConfirmDescription": "Показатель убирается из вашего списка. Записанные значения сохраняются.", + "deletedToast": "Свой показатель удалён", + "deleteError": "Не удалось удалить свой показатель", + "showAllValues": "Показать все значения", + "emptyDescription": "Определите собственные измерения, чтобы отслеживать их и строить графики.", + "noValuesYet": "Значений пока нет", + "loadError": "Не удалось загрузить свои показатели", + "loadMore": "Загрузить больше значений", + "showingLatestOf": "Показаны последние {shown} из {total}", + "backToMeasurements": "Назад к измерениям", + "form": { + "name": "Название", + "namePlaceholder": "например, сила хвата утром", + "unit": "Единица", + "unitPlaceholder": "например, кг", + "decimals": "Знаков после запятой", + "decimalsPlaceholder": "например, 1", + "targetLow": "Нижняя цель", + "targetLowPlaceholder": "Нижняя граница", + "targetHigh": "Верхняя цель", + "targetHighPlaceholder": "Верхняя граница", + "description": "Описание", + "descriptionPlaceholder": "Что это измеряет (необязательно)", + "targetHint": "Целевой диапазон необязателен и рисуется полосой на графике.", + "correlationEnabled": "Использовать в поиске связей", + "correlationEnabledHint": "Добавляет этот показатель как ограниченный канал повседневного поведения. По умолчанию остаётся выключенным.", + "requiredError": "Название и единица обязательны", + "rangeOrderError": "Нижняя цель не должна превышать верхнюю", + "save": "Сохранить", + "savedToast": "Свой показатель сохранён", + "updatedToast": "Свой показатель обновлён", + "saveError": "Не удалось сохранить свой показатель" + }, + "entry": { + "value": "Значение", + "measuredAt": "Дата", + "note": "Заметка", + "addDescription": "Записать значение для этого показателя.", + "edit": "Изменить значение", + "editTitle": "Изменить значение", + "editDescription": "Обновите значение, дату или заметку.", + "delete": "Удалить значение", + "deleteConfirmTitle": "Удалить это значение?", + "deleteConfirmDescription": "Это значение удаляется навсегда.", + "valueError": "Введите числовое значение", + "timestampError": "Введите корректную дату", + "savedToast": "Значение записано", + "saveError": "Не удалось записать значение", + "editedToast": "Значение обновлено", + "editError": "Не удалось обновить значение", + "deletedToast": "Значение удалено", + "restoredToast": "Значение восстановлено", + "restoreError": "Восстановление не удалось", + "deleteError": "Не удалось удалить значение" + }, + "chart": { + "empty": "Нет значений в этом диапазоне", + "valueLabel": "Значение", + "range": { + "30": "30д", + "90": "90д", + "365": "1г", + "all": "Все" + } + }, + "detail": { + "title": "Свой показатель", + "genericDescription": "Измерение, которое вы отслеживаете. Добавляйте значения, чтобы следить за ним во времени.", + "emptyTitle": "Значений пока нет", + "emptyDescription": "Добавьте первое значение, чтобы начать строить график этого показателя.", + "valuesTitle": "{metric}: все значения", + "valuesDescription": "Каждое записанное значение для этого показателя.", + "backToMetric": "Назад к {metric}" + } + }, + "nutrients": { + "names": { + "vitamin_a": "Витамин A", + "thiamin": "Тиамин (B1)", + "riboflavin": "Рибофлавин (B2)", + "niacin": "Ниацин (B3)", + "pantothenic_acid": "Пантотеновая кислота (B5)", + "vitamin_b6": "Витамин B6", + "biotin": "Биотин (B7)", + "folate": "Фолиевая кислота (B9)", + "vitamin_b12": "Витамин B12", + "vitamin_c": "Витамин C", + "vitamin_d": "Витамин D", + "vitamin_e": "Витамин E", + "vitamin_k": "Витамин K", + "calcium": "Кальций", + "iron": "Железо", + "magnesium": "Магний", + "phosphorus": "Фосфор", + "zinc": "Цинк", + "copper": "Медь", + "manganese": "Марганец", + "selenium": "Селен", + "chromium": "Хром", + "molybdenum": "Молибден", + "iodine": "Йод", + "water": "Вода", + "caffeine": "Кофеин", + "dha": "DHA (омега-3)", + "epa": "EPA (омега-3)" + }, + "page": { + "title": "Приём нутриентов", + "description": "Вода и приём витаминов и минералов, синхронизированные из приложения здоровья на телефоне, плюс ручные записи воды.", + "moduleOffDescription": "Включите модуль нутриентов, чтобы видеть здесь воду и приём витаминов и минералов. Синхронизированный приём становится частью записи, которую может читать Coach.", + "moduleOffCta": "Включить нутриенты", + "emptyTitle": "Данных о нутриентах пока нет", + "emptyDescription": "Данные поступают из синхронизации с приложением здоровья на телефоне или из ручной записи воды.", + "loadError": "Не удалось загрузить данные о нутриентах", + "lastAttemptTitle": "Синхронизация пришла, но сохранить ничего не удалось", + "lastAttemptAt": "Последняя попытка: {date}", + "lastAttemptReason": { + "unitMismatch": "Пришедшие значения не совпали с единицами, которые это приложение ожидает для этих нутриентов, поэтому их не удалось сохранить.", + "valueOutOfRange": "Пришедшие количества были выше, чем это приложение может правдоподобно сохранить, поэтому их не удалось сохранить.", + "dayInvalid": "Записи содержали дату, которую сервер не смог принять. Это бывает, когда часы или часовой пояс на отправляющей стороне неверны, так что стоит проверить.", + "upsertFailed": "Эти записи дошли до сервера, но проблема на этой стороне помешала их сохранению. Вам ничего делать не нужно.", + "unknown": "Эти записи пришли, но их не удалось сохранить." + } + }, + "hydration": { + "referenceMeta": "Референсный приём {value} {unit}/день (EFSA)", + "loadError": "Не удалось загрузить воду." + }, + "caffeine": { + "ceilingMeta": "Безопасный потолок {value} {unit}/день (EFSA)", + "loadError": "Не удалось загрузить кофеин." + }, + "micronutrients": { + "title": "Витамины и минералы", + "rowMeta": "{days} из {window} дней, реф. {value} {unit} (EFSA)", + "rowMetaNoRef": "{days} из {window} дней", + "footer": "Из {total} отслеживаемых микронутриентов данные в этом окне есть у {tracked}.", + "emptyTitle": "Данные о микронутриентах ещё не синхронизированы", + "loadError": "Не удалось загрузить данные о нутриентах", + "sourcePart": "{source} {value} {unit}", + "aboveUpperLimit": "Выше допустимого верхнего уровня потребления для взрослых {value} {unit} в день ({source}).", + "aboveUpperLimitSupplemental": "Доля из добавок выше допустимого верхнего уровня потребления для взрослых {value} {unit} в день для добавок ({source}).", + "upperLimitForm": { + "retinol": "Уровень относится только к преформированному витамину A (ретинолу): если количество получено из бета-каротина, он не применяется.", + "folic_acid": "Уровень относится к фолиевой кислоте из добавок и обогащённых продуктов, а не к фолату в обычной пище.", + "magnesium_salts": "Уровень относится к легко диссоциирующим солям магния в добавках, а не к магнию в пище.", + "alpha_tocopherol": "Уровень установлен для альфа-токоферола." + } + }, + "sparseNote": "Низкое число здесь обычно означает редкие записи, а не дефицит. Суточные итоги Apple Health отражают то, что записали ваши приложения, а не общий приём с пищей.", + "units": { + "IU": "МЕ" + }, + "sources": { + "APPLE_HEALTH": "Синхронизировано", + "MANUAL": "Введено", + "SUPPLEMENT": "Добавки" + } + }, + "daily": { + "line": { + "allClear": "Сегодня ничего не требует вашего внимания.", + "scoreReady": "Ваш балл здоровья на сегодня готов." + }, + "push": { + "title": "Ваша утренняя сводка", + "bodyProvisional": "{line}\nСон прошлой ночи ещё не поступил.", + "titleScore": "Утренний балл {score}", + "band": { + "green": "Сегодня всё выглядит стабильно.", + "yellow": "Сегодня на пару вещей стоит взглянуть.", + "red": "Сегодня некоторые области требуют внимания." + } + }, + "item": { + "doseWindow": { + "title": "Пора принять лекарство", + "body": "Скоро пора принять дозу.", + "bodyNamed": "Скоро пора принять {name}.", + "overdueTitle": "Лекарство просрочено", + "overdueBody": "Доза просрочена.", + "overdueBodyNamed": "{name} просрочено." + }, + "preventiveCare": { + "title": "Пора на осмотр", + "body": "Пора: {label}.", + "bodyManyNamed": "Пора: {labels}" + }, + "syncIssue": { + "title": "Синхронизация требует внимания", + "body": "{integration} не синхронизируется. Переподключите, чтобы данные оставались актуальными." + }, + "coachCheckin": { + "title": "Пора проверить план", + "body": "Прошла примерно неделя с тех пор, как вы задали этот план. Оставьте его, скорректируйте или отпустите. В любом случае без давления.", + "bodyPlan": "Около недели назад вы задали: «{plan}». Оставьте его, скорректируйте или отпустите. В любом случае без давления.", + "adjustPrompt": "Я хотел бы скорректировать свой план проверки.", + "adjustPromptPlan": "Я хотел бы скорректировать этот план: «{plan}»" + }, + "tensionWindow": { + "title": "Возможное напряжение сегодня", + "body": { + "morning": "Этим утром ваш пульс продолжительное время был выше базового уровня покоя, пока вы не двигались, — возможно, некоторое напряжение.", + "afternoon": "Днём ваш пульс продолжительное время был выше базового уровня покоя, пока вы не двигались, — возможно, некоторое напряжение.", + "evening": "Вечером ваш пульс продолжительное время был выше базового уровня покоя, пока вы не двигались, — возможно, некоторое напряжение.", + "night": "Ночью ваш пульс продолжительное время был выше базового уровня покоя, пока вы не двигались, — возможно, некоторое напряжение." + } + }, + "ecgNewRecording": { + "title": "Новая запись ЭКГ", + "body": "Ваше устройство записало новую ЭКГ. Она готова к просмотру.", + "bodyVerdict": "Ваше устройство записало новую ЭКГ и сообщило: {verdict}.", + "verdict": { + "irregular": "возможный нерегулярный ритм", + "notDetected": "нерегулярный ритм не обнаружен", + "inconclusive": "неоднозначный результат" + } + }, + "sameTimeBaseline": { + "title": { + "below": "Отстаёте от обычного темпа", + "above": "Опережаете обычный темп" + }, + "body": { + "below": "К {time} у вас {today} шагов. В обычный день к этому времени у вас около {typical}.", + "above": "К {time} у вас {today} шагов — больше, чем обычные для вас к этому времени {typical}." + } + }, + "upcomingVisit": { + "title": "Предстоит приём", + "bodyToday": "{what} сегодня", + "bodyTomorrow": "{what} завтра", + "bodyDayAfterTomorrow": "{what} послезавтра" + } + }, + "action": { + "logDose": "Записать дозу", + "reconnect": "Переподключить", + "viewCheckups": "Показать осмотры", + "viewAppointment": "Показать приём", + "viewAppointments": "Показать приёмы", + "checkinKeep": "Оставить", + "checkinAdjust": "Скорректировать", + "checkinLetGo": "Отпустить", + "viewMilestone": "Показать", + "viewPulse": "Показать пульс", + "viewEcg": "Показать запись", + "viewSteps": "Показать шаги" + }, + "today": { + "scoreLabel": "Балл здоровья", + "deltaVsBaseline": "{delta} к вашему базовому уровню", + "deltaFlat": "В соответствии с вашим базовым уровнем", + "sleepPending": "Сон прошлой ночи ещё не поступил, поэтому сегодняшняя оценка предварительная.", + "worthALook": "Стоит взглянуть", + "allClear": "Сегодня ничего не требует вашего внимания.", + "ringLink": "Открыть детали {metric}", + "heading": "Сегодня", + "steadyWeeksOne": "Стабильно {count} неделю", + "steadyWeeksFew": "Стабильно {count} недели", + "steadyWeeksOther": "Стабильно {count} недель", + "valueWithUnit": "{value} {unit}", + "rangeWithUnit": "{low}–{high} {unit}", + "rangeAtThisTime": "{range} для этого времени суток", + "vital": { + "RESTING_HEART_RATE": "ЧСС в покое", + "HEART_RATE_VARIABILITY": "Вариабельность сердечного ритма", + "RESPIRATORY_RATE": "Частота дыхания", + "OXYGEN_SATURATION": "Насыщение кислородом", + "BODY_TEMPERATURE": "Температура тела", + "SKIN_TEMPERATURE": "Температура кожи", + "BLOOD_PRESSURE_SYS": "Систолическое", + "BLOOD_PRESSURE_DIA": "Диастолическое", + "BLOOD_GLUCOSE": "Глюкоза крови", + "PULSE": "Пульс", + "WEIGHT": "Вес", + "generic": "Показатель жизнедеятельности" + }, + "steadyAtLeastWeeksOne": "Стабильно как минимум {count} неделю", + "steadyAtLeastWeeksFew": "Стабильно как минимум {count} недели", + "steadyAtLeastWeeksOther": "Стабильно как минимум {count} недель" + }, + "milestone": { + "metric": { + "restingHeartRate": "ЧСС в покое", + "heartRateVariability": "вариабельность сердечного ритма", + "respiratoryRate": "частота дыхания", + "weight": "вес", + "generic": "этот показатель" + }, + "record": { + "title": "Новый рекорд: {metric}", + "body": "Сегодня личный рекорд по вашему показателю «{metric}». Тихо отмечено, делать ничего не нужно." + }, + "returnToBaseline": { + "title": "Снова в диапазоне: {metric}", + "body": "Ваш показатель «{metric}» вернулся в обычный диапазон. Что бы это ни было, оно прошло." + }, + "sustainedInRange": { + "week1": { + "title": "Неделя в диапазоне", + "body": "Ваш показатель «{metric}» держится в обычном диапазоне уже неделю. Приятно и стабильно." + }, + "week2": { + "title": "Две недели в диапазоне", + "body": "Ваш {metric} держится в вашем обычном диапазоне уже две недели. Спокойно и стабильно." + }, + "week3": { + "title": "Три недели в диапазоне", + "body": "Три недели ваш {metric} остаётся в вашем обычном диапазоне. Настоящая полоса стабильности." + }, + "week4": { + "title": "Месяц в диапазоне", + "body": "Целый месяц ваш {metric} в вашем обычном диапазоне. Прекрасно стабильно." + } + } + }, + "lead": { + "vitalOutside": { + "above": "{metric}: {value}, выше вашего обычного диапазона {range}.", + "below": "{metric}: {value}, ниже вашего обычного диапазона {range}." + }, + "vitalsOutside": { + "aboveOne": "{metric}: {value}, выше вашего обычного диапазона {range}, и ещё {count} показатель тоже вне своего диапазона.", + "aboveFew": "{metric}: {value}, выше вашего обычного диапазона {range}, и ещё {count} показателя тоже вне своего диапазона.", + "aboveOther": "{metric}: {value}, выше вашего обычного диапазона {range}, и ещё {count} показателей тоже вне своего диапазона.", + "belowOne": "{metric}: {value}, ниже вашего обычного диапазона {range}, и ещё {count} показатель тоже вне своего диапазона.", + "belowFew": "{metric}: {value}, ниже вашего обычного диапазона {range}, и ещё {count} показателя тоже вне своего диапазона.", + "belowOther": "{metric}: {value}, ниже вашего обычного диапазона {range}, и ещё {count} показателей тоже вне своего диапазона." + }, + "sleep": { + "more": "Прошлой ночью вы спали {duration}, на {diff} больше обычного.", + "less": "Прошлой ночью вы спали {duration}, на {diff} меньше обычного.", + "usual": "Прошлой ночью вы спали {duration}, близко к вашему обычному.", + "plain": "Прошлой ночью вы спали {duration}." + }, + "vitalsInRangeOne": "Ваш последний показатель в пределах обычного диапазона.", + "vitalsInRangeFew": "Все {count} ваших последних показателя в пределах обычного диапазона.", + "vitalsInRangeOther": "Все {count} ваших последних показателей в пределах обычного диапазона.", + "vitalInRange": "{metric}: {value}, в пределах вашего обычного диапазона {range}." + }, + "todayFact": { + "restMode": { + "label": "Режим отдыха", + "value": "День {day}" + }, + "medications": { + "label": "Лекарства", + "value": "{taken} из {scheduled} принято" + }, + "appointment": { + "label": "Приём", + "today": "Сегодня {time}, {what}", + "tomorrow": "Завтра {time}, {what}" + }, + "sleep": { + "label": "Прошлая ночь", + "plain": "{duration}", + "usual": "{duration}, близко к вашему обычному", + "more": "{duration}, на {diff} больше обычного", + "less": "{duration}, на {diff} меньше обычного" + }, + "vitals": { + "label": "Показатели", + "allInOne": "{count} проверен, в вашем диапазоне", + "allInFew": "{count} проверено, все в вашем диапазоне", + "allInOther": "{count} проверено, все в вашем диапазоне", + "oneOut": { + "above": "{metric} выше вашего диапазона", + "below": "{metric} ниже вашего диапазона" + }, + "someOut": "{count} из {total} вне вашего диапазона" + }, + "cycle": { + "label": "Цикл", + "value": "{phase}, день {day}", + "dayOnly": "День {day}" + } + } + }, + "reportSelection": { + "leafAnamnesis": "Профиль здоровья", + "groupIdentity": "Личные данные", + "groupVitals": "Показатели жизнедеятельности", + "groupCardio": "Сердце и кровообращение", + "groupBody": "Измерения тела", + "groupSleepRecovery": "Сон и восстановление", + "groupActivity": "Активность", + "groupMobility": "Подвижность и походка", + "groupEnvironment": "Окружающая среда", + "groupGlucose": "Глюкоза крови", + "groupLabs": "Результаты анализов", + "groupMedications": "Лекарства", + "groupHistory": "Состояния и аллергии", + "groupSensitive": "Чувствительные данные", + "leafPatientIdentity": "Имя, дата рождения, пол, рост", + "leafInsurance": "Страховщик и номер страховки", + "leafGlucosePanel": "Панель глюкозы (время в диапазоне, GMI, вариабельность)", + "leafLabResults": "Результаты анализов", + "leafMedicationList": "Список лекарств", + "leafMedicationAdministrations": "Каждая записанная доза", + "leafMedicationCompliance": "Приверженность", + "leafGlp1Therapy": "Терапия GLP-1 (история доз, побочные эффекты)", + "leafAllergies": "Аллергии и непереносимости", + "leafIllnessEpisodes": "Эпизоды заболеваний", + "leafFamilyHistory": "Семейный анамнез", + "leafMood": "Настроение", + "leafCycle": "Менструальный цикл", + "templateStandard": "Стандартный отчёт для врача", + "applyStandard": "Применить {template}", + "standardHint": "Один клик заполняет то, что обычно нужно для общего визита. Каждая запись остаётся редактируемой.", + "groupCount": "{on}/{total}", + "groupDisclosure": "Показать записи в {group}", + "sensitiveHint": "Здесь ничего не выбрано заранее. Выберите каждую запись сами.", + "scopeNone": "Пока ничего не выбрано. Выберите, что включить, или примените стандартный отчёт.", + "scopeCount": "{count} записей из {groups} разделов", + "scopeSensitive": "вкл. {names}", + "leafVisits": "Визиты", + "leafSurgicalHistory": "История операций", + "leafImmunizations": "Вакцинация", + "leafEmergency": "Экстренная информация (группа крови, контакты, распоряжения)", + "leafMedicationEffect": "Изменение вокруг начала каждого лекарства (нужен список лекарств)", + "leafWorkouts": "Тренировки (сводка по видам спорта)", + "leafHrvSdnn": "ВСР (SDNN)" + }, + "recordSharing": { + "banner": { + "viewing": "Вы в записи {name}", + "readOnly": "Вы можете читать её, но не менять.", + "canAdd": "Вы можете добавлять в неё, но не менять и не удалять то, что там есть.", + "leave": "Назад к моей записи" + }, + "switcher": { + "label": "Открыть запись", + "ownRecord": "Моя собственная запись" + }, + "switch": { + "failed": "Не удалось открыть эту запись. Попробуйте ещё раз.", + "noLongerAvailable": "Эта запись больше не доступна вам." + }, + "unavailable": { + "title": "Не входит в общий доступ", + "description": "Общий доступ охватывает саму запись здоровья, включая медицинский фон в разделе «Анамнез». Настройки аккаунта, подключённые сервисы, уведомления и функции ИИ остаются у владельца аккаунта.", + "leave": "Назад к моей записи" + }, + "state": { + "active": "Активно", + "pending": "Ожидает принятия", + "expired": "Истекло", + "revoked": "Завершено" + }, + "row": { + "readOnly": "Может читать запись", + "canWrite": "Может читать и добавлять записи", + "canManage": "Может читать запись, добавлять в неё, а также менять и удалять то, что в ней есть", + "entireRecord": "Охватывает всю запись", + "sections": "Охватывает: {sections}", + "noSections": "Не охватывает ничего: этот доступ не открывает ни одной части записи", + "invited": "Приглашён", + "accepted": "Принято", + "expires": "Истекает", + "lastUsed": "Последнее открытие", + "neverUsed": "никогда", + "endedByYou": "Вы завершили", + "endedByOwner": "Отозвано", + "handedBack": "Возвращено", + "ended": "Завершено" + }, + "invite": { + "title": "Пригласить кого-нибудь", + "description": "Ничего не передаётся, пока они не примут.", + "needsAccount": "Человеку нужен собственный аккаунт HealthLog на этом сервере, и он найдёт приглашение в разделе «Настройки → Общий доступ».", + "identifierLabel": "Имя пользователя или e-mail", + "identifierPlaceholder": "Имя, с которым они входят", + "identifierHint": "Им нужен аккаунт на этом сервере. Приглашения нельзя отправить на адрес электронной почты, который не зарегистрирован.", + "accessLegend": "Что им разрешено", + "accessReadLabel": "Может просматривать", + "accessReadCapability": "Они могут читать всё, что открывает эта запись. Они не могут ничего добавлять или менять.", + "accessWriteLabel": "Может просматривать и добавлять", + "accessWriteCapability": "Они могут добавлять в запись, но не могут ничего менять или удалять, даже то, что добавили сами.", + "accessWriteDetail": "Они могут добавлять измерения, результаты анализов, новый показатель для отслеживания, запись о заболевании, побочный эффект к лекарству, новое лекарство и отмечать дозу как принятую или пропущенную. Они не могут ничего менять или удалять, даже то, что добавили сами, и не могут отложить одно из ваших напоминаний. Это можете только вы.", + "accessManageLabel": "Может управлять", + "accessManageCapability": "Они могут добавлять, менять и удалять записи, включая те, что вы внесли сами.", + "accessManageDetail": "Они также могут читать аналитику, построенную по вашей записи. Они не могут менять ваш вход, настройки безопасности, подключения или то, у кого ещё есть доступ. Вы можете завершить это в любой момент.", + "manageStepUpNote": "Предложить это можно только в браузере, и при наличии второго фактора он будет запрошен.", + "scopeLegend": "Что они могут открыть", + "scopeAllLabel": "Вся запись", + "scopeAllCapability": "Каждая её часть, как общий доступ работал всегда.", + "scopeSomeLabel": "Только выбранные вами разделы", + "scopeSomeCapability": "Всё, что вы не выберете, остаётся для них закрытым.", + "scopeManageNote": "Доступ с управлением всегда охватывает всю запись.", + "scopeLeakNote": "Раздел может упоминать остальное ваше здоровье в своих заметках и названиях. Общий доступ к разделу открывает всё, что в нём написано.", + "scopeAggregateNote": "Обзор сводки, балл здоровья и ежедневная сводка появляются только при общем доступе ко всей записи.", + "scopeDocumentsNote": "Документ может содержать что угодно. Открывайте его, только если им можно прочитать его целиком.", + "scopeEmptyHint": "Выберите хотя бы один раздел или вернитесь к общему доступу ко всей записи.", + "scopeChooseHint": "Выберите, открывать всю запись или только выбранные разделы.", + "expiresLabel": "Доступ заканчивается (необязательно)", + "expiresHint": "Оставьте пустым для доступа, который длится, пока кто-нибудь его не завершит. Дата здесь проверяется при каждом запросе, поэтому доступ прекращается сам в конце этого дня.", + "submit": "Отправить приглашение", + "submitting": "Отправка…", + "sent": "Приглашение отправлено {name}.", + "errorNoAccount": "На этом сервере нет аккаунта с таким именем.", + "errorDuplicate": "У этого аккаунта уже есть доступ к вашей записи.", + "errorSelf": "Это ваш собственный аккаунт.", + "errorInvalid": "Введите имя пользователя или адрес электронной почты.", + "errorRateLimited": "Слишком много приглашений. Попробуйте позже.", + "errorFailed": "Приглашение не удалось отправить. Попробуйте ещё раз.", + "errorScope": "Эти разделы нельзя открыть так. Выберите хотя бы один раздел или откройте всю запись.", + "errorManageBrowserOnly": "Доступ с управлением можно предложить только в браузере.", + "errorStepUp": "Подтвердите второй фактор или ключ доступа, затем попробуйте ещё раз.", + "errorOffline": "Это не дошло до сервера. Ваше приглашение всё ещё здесь. Проверьте подключение и попробуйте ещё раз." + }, + "given": { + "title": "Кто может открыть мою запись", + "description": "Завершённый доступ остаётся в списке, чтобы вы всегда видели, у кого он был и когда.", + "emptyTitle": "Никто больше не может открыть вашу запись", + "emptyDescription": "Пригласите кого-нибудь выше, если хотите, чтобы они могли её читать.", + "loadError": "Список не удалось загрузить.", + "revoke": "Завершить доступ", + "withdrawInvite": "Отозвать", + "revokeTitle": "Завершить доступ {name}?", + "revokeBody": "Они сразу теряют доступ, включая любой браузер, в котором у них открыта ваша запись. То, что они уже видели, нельзя вернуть. Вы можете пригласить их снова в любой момент.", + "revokeEntriesStay": "Всё, что они внесли, остаётся в вашей записи, и вы можете удалить любое из этого сами.", + "revokeAttribution": "Кто что внёс, остаётся видимым в вашем журнале активности {days} дней.", + "revokeConfirm": "Завершить доступ" + }, + "received": { + "title": "Записи, которые я могу открыть", + "description": "Приглашение ничего вам не даёт, пока вы его не примете.", + "emptyTitle": "Никто не открыл вам запись", + "emptyDescription": "Когда кто-то пригласит вас, приглашение появится здесь.", + "loadError": "Список не удалось загрузить.", + "accept": "Принять", + "accepting": "Принятие…", + "writeConsent": "Если вы примете, то, что вы добавите, станет частью записи {name}. После этого вы не сможете менять или удалять записи; это может только {name}.", + "manageConsent": "Если вы примете, вы сможете добавлять в запись {name}, а также менять или удалять то, что в ней уже есть, включая записи, сделанные самим {name}. Всё, что вы делаете, записывается под вашим именем в их журнале активности, и {name} может завершить ваш доступ в любой момент.", + "open": "Открыть", + "renounce": "Вернуть", + "renounceTitle": "Вернуть запись {name}?", + "renounceBody": "Вы сразу теряете доступ. Они могут пригласить вас снова в любой момент.", + "renounceConfirm": "Вернуть", + "detail": "Вы можете вернуть доступ в любой момент." + }, + "activity": { + "title": "Когда открывали мою запись", + "description": "Каждый раз, когда кто-то другой открывал вашу запись.", + "retention": "Это охватывает последние {days} дней. Более старые записи удаляются.", + "emptyTitle": "Никто не открывал вашу запись", + "emptyDescription": "Открытия кем-либо, кроме вас, появляются здесь, по одной строке на человека в день.", + "loadError": "Активность не удалось загрузить.", + "opened": "{name} открыл(а) вашу запись {count}×", + "acted": "{name} внёс(ла) изменение в вашу запись", + "deletedAccount": "Удалённый аккаунт" + }, + "delegate": { + "addOnlyNote": "Вы можете добавлять в эту запись. Менять или удалять записи может только {name}." + }, + "lookingAfter": { + "kindShared": "Общая запись", + "kindManaged": "Управляемый профиль" + }, + "managed": { + "title": "Записи, за которыми вы следите", + "description": "Записи здоровья без собственного входа.", + "explainer": "Управляемый профиль — это запись здоровья для того, кто не входит сам, например для ребёнка или человека, о котором вы заботитесь. У неё нет входа и адреса электронной почты, и вы становитесь её первым опекуном. Позже вы можете добавить других опекунов, и любой из вас может переключиться в запись, чтобы поддерживать её в актуальном состоянии.", + "nameLabel": "Название", + "namePlaceholder": "Название, по которому вы узнаете эту запись", + "nameHint": "До 80 символов. Показывается везде, где появляется эта запись.", + "nameRequired": "Дайте записи название.", + "nameTooLong": "Это название длиннее 80 символов.", + "dobLabel": "Дата рождения (необязательно)", + "dobHint": "Оставьте пустым, если не хотите её записывать. Из года ничего не угадывается.", + "localeLabel": "Язык этой записи", + "localeHint": "Язык, на котором пишется текст в этой записи. Ваши собственные экраны остаются на вашем языке.", + "genderLabel": "Пол (необязательно)", + "genderHint": "Определяет, включено ли отслеживание цикла для этой записи. Можно изменить в любой момент.", + "genderNone": "Не указан", + "genderMale": "Мужской", + "genderFemale": "Женский", + "genderOther": "Другой", + "timezoneHint": "Часовой пояс, в котором измеряются дни этой записи.", + "timezoneInvalid": "Этот браузер не знает такой часовой пояс.", + "create": "Создать профиль", + "creating": "Создание…", + "created": "{name} настроен(а). Вы можете переключиться в эту запись из меню аккаунта.", + "errorStepUp": "Подтвердите второй фактор или ключ доступа, затем попробуйте ещё раз.", + "errorOffline": "Это не дошло до сервера. Ничего не изменилось. Проверьте подключение и попробуйте ещё раз.", + "errorInvalid": "Сервер отклонил эти данные. Проверьте название, дату и часовой пояс.", + "errorFailed": "Профиль не удалось создать.", + "edit": "Изменить", + "editSave": "Сохранить изменения", + "editSaving": "Сохранение…", + "editLoadError": "Эти данные не удалось загрузить.", + "editErrorGone": "Эта запись исчезла, или вы больше за ней не следите.", + "editErrorFailed": "Изменения не удалось сохранить.", + "delete": "Удалить профиль", + "deleteTitle": "Удалить {name}?", + "deleteBody": "Всё, что записано для {name}, уходит вместе с профилем: измерения, лекарства, документы и заметки. Это нельзя отменить.", + "deleteGuardiansOne": "{count} человек следит за этой записью сегодня и потеряет её.", + "deleteGuardiansFew": "{count} человека следят за этой записью сегодня и потеряют её.", + "deleteGuardiansOther": "{count} человек следят за этой записью сегодня и потеряют её.", + "deleteFloorNote": "Это также выход, когда вы последний опекун: вы можете завершить запись, но не можете оставить её без присмотра.", + "deleteConfirm": "Удалить профиль", + "guardiansTitle": "Кто следит за {name}", + "guardianYou": "(вы)", + "guardianSince": "Следит за этой записью с {date}", + "guardianPending": "Приглашён(а) {date}, ещё не принято", + "guardianRemove": "Завершить доступ", + "guardianRemoveTitle": "Завершить доступ {name}?", + "guardianRemoveBody": "{name} больше не сможет открывать {profile}. Всё, что они внесли, остаётся в записи.", + "guardianWithdrawBody": "Приглашение для {name} отозвано. Они никогда не открывали {profile}, поэтому в записи ничего не меняется.", + "guardianRemoveConfirm": "Завершить доступ", + "soleGuardian": "Вы единственный человек, который следит за {name}, поэтому здесь нет доступа, который можно завершить. Пригласите кого-нибудь и дождитесь принятия, верните свой собственный доступ в разделе «Записи, которые я могу открыть» или удалите профиль.", + "guardianInviteLabel": "Пригласить другого опекуна", + "guardianInvite": "Отправить приглашение", + "guardianInviting": "Отправка…", + "guardianInvited": "Приглашение отправлено {name}.", + "guardianExpiresHint": "Необязательно. Доступ заканчивается в конце этого дня в вашем часовом поясе.", + "guardianPendingNote": "Приглашённый опекун считается только после принятия. До тех пор вы всё ещё последний, и вернуть свой собственный доступ по-прежнему нельзя.", + "guardianErrorDuplicate": "У этого аккаунта уже есть доступ к этой записи.", + "guardianErrorManagedInvitee": "Управляемый профиль не может следить за другой записью. Пригласите аккаунт, который входит сам.", + "guardianErrorNoAccount": "На этом сервере нет аккаунта с таким именем или e-mail.", + "guardianErrorRateLimit": "Слишком много приглашений за последний час. Подождите немного и попробуйте ещё раз.", + "guardianErrorFailed": "Приглашение не удалось отправить.", + "errorMfaRequired": "Для этого нужен второй фактор или ключ доступа, а у вашего аккаунта пока нет ни того, ни другого. Настройте его в разделе «Настройки → Безопасность», затем попробуйте ещё раз.", + "rosterLoadError": "Не удалось загрузить, кто следит за этой записью.", + "errorRateLimit": "Слишком много профилей создано за последний час. Подождите немного и попробуйте ещё раз.", + "handover": { + "action": "Передать", + "title": "Передать {name}", + "description": "Дайте {name} собственный вход. Ничего не копируется и не перемещается: запись становится их аккаунтом.", + "guardiansLabel": "Доступ после передачи", + "guardiansHint": "Ваше предложение. {name} увидит его и решит после входа.", + "access": { + "end": "Без доступа", + "read": "Только просмотр", + "manage": "Управление" + }, + "expiryLabel": "Ссылка действительна", + "expiry1": "1 день", + "expiry7": "7 дней", + "expiry14": "14 дней", + "minorHint": "{name} младше 16 лет. Стоит подумать о сохранении доступа на просмотр, а также о том, чтобы пройти этот шаг вместе.", + "irreversible": "Как только {name} воспользуется ссылкой, передачу нельзя отменить. Запись принадлежит им, и они решают, у кого останется доступ.", + "afterwards": "{name} лично подтверждает отказ от ответственности и любое согласие на ИИ. Напоминания для этой записи перестают приходить вам.", + "replaceNote": "Создание новой ссылки отзывает открытую.", + "create": "Создать ссылку", + "creating": "Создание…", + "linkOnce": "Эта ссылка показывается только сейчас. Передайте её {name} лично или через канал, которому доверяете, либо дайте им отсканировать код.", + "qrAlt": "QR-код ссылки передачи для {name}", + "urlLabel": "Ссылка передачи", + "copy": "Копировать", + "copied": "Ссылка скопирована", + "copyError": "Ссылку не удалось скопировать. Выделите её и скопируйте вручную.", + "linkExpires": "Действительна до {date}.", + "done": "Готово", + "pending": "Ссылка передачи открыта до {date}.", + "replace": "Новая ссылка", + "revoke": "Отозвать ссылку", + "revoked": "Ссылка отозвана", + "revokeFailed": "Ссылку не удалось отозвать. Попробуйте ещё раз.", + "errorFailed": "Ссылку передачи не удалось создать.", + "errorRosterChanged": "Список опекунов за это время изменился. Закройте это и откройте снова.", + "oidcOnly": "Передача профиля недоступна на этом сервере.", + "loadError": "Статус передачи не удалось загрузить.", + "entryHint": "Когда {name} будет готов(а) сам(а) следить за этой записью.", + "methodSso": "{name} входит через единый вход, когда пользуется ссылкой.", + "methodBoth": "{name} может задать пароль или войти через единый вход." + }, + "deleteBodyGrace": "Всё, что записано для {name}, уходит вместе с профилем: измерения, лекарства, документы и заметки. Профиль сразу блокируется и стирается через {days} дней. До тех пор администратор этого сервера может отменить удаление." + }, + "toast": { + "savedTo": "Сохранено в записи {name}" + }, + "activityVerb": { + "measurementCreate": "{name} добавил(а) измерение", + "labResultCreate": "{name} добавил(а) результат анализа", + "allergyCreate": "{name} добавил(а) аллергию", + "familyHistoryCreate": "{name} добавил(а) запись семейного анамнеза", + "illnessEpisodeCreate": "{name} добавил(а) запись о заболевании", + "biomarkerCreate": "{name} добавил(а) показатель", + "customMetricEntryCreate": "{name} записал(а) отслеживаемое значение", + "medicationSideEffectCreate": "{name} отметил(а) побочный эффект", + "medicationCreate": "{name} добавил(а) лекарство", + "medicationIntake": "{name} отметил(а) дозу", + "medicationIntakeRefused": "{name} попытался(ась) изменить дозу или отложить напоминание, и было отказано", + "measurementUpdate": "{name} изменил(а) измерение", + "measurementDelete": "{name} убрал(а) измерение", + "measurementDeleteBulk": "{name} убрал(а) несколько измерений сразу", + "measurementRestore": "{name} восстановил(а) измерение", + "measurementReminderCreate": "{name} добавил(а) напоминание об измерении", + "measurementReminderUpdate": "{name} изменил(а) напоминание об измерении", + "measurementReminderDelete": "{name} убрал(а) напоминание об измерении", + "measurementReminderComplete": "{name} выполнил(а) напоминание об измерении", + "measurementReminderSatisfy": "{name} закрыл(а) напоминание об измерении", + "measurementReminderSkip": "{name} пропустил(а) напоминание об измерении", + "measurementReminderSnooze": "{name} отложил(а) напоминание об измерении", + "labResultUpdate": "{name} изменил(а) результат анализа", + "labResultDelete": "{name} убрал(а) результат анализа", + "labResultRestore": "{name} восстановил(а) результат анализа", + "biomarkerUpdate": "{name} изменил(а) показатель", + "biomarkerDelete": "{name} убрал(а) показатель", + "allergyUpdate": "{name} изменил(а) аллергию", + "allergyDelete": "{name} убрал(а) аллергию", + "familyHistoryUpdate": "{name} изменил(а) запись семейного анамнеза", + "familyHistoryDelete": "{name} убрал(а) запись семейного анамнеза", + "illnessEpisodeUpdate": "{name} изменил(а) запись о заболевании", + "illnessEpisodeDelete": "{name} убрал(а) запись о заболевании", + "illnessEpisodeResolve": "{name} отметил(а) заболевание как завершённое", + "illnessEpisodeRestore": "{name} восстановил(а) запись о заболевании", + "encounterVisitCreate": "{name} добавил(а) визит", + "encounterVisitUpdate": "{name} изменил(а) визит", + "encounterVisitDelete": "{name} удалил(а) визит", + "encounterVisitRestore": "{name} восстановил(а) визит", + "vaccinationRecordCreate": "{name} добавил(а) вакцинацию", + "vaccinationRecordUpdate": "{name} изменил(а) вакцинацию", + "vaccinationRecordDelete": "{name} удалил(а) вакцинацию", + "vaccinationRecordRestore": "{name} восстановил(а) вакцинацию", + "practitionerContactCreate": "{name} добавил(а) клинику в адресную книгу", + "practitionerContactUpdate": "{name} изменил(а) запись адресной книги", + "practitionerContactDelete": "{name} удалил(а) запись адресной книги", + "practitionerContactRestore": "{name} восстановил(а) запись адресной книги", + "illnessDayLogUpsert": "{name} записал(а) день болезни", + "medicationUpdate": "{name} изменил(а) лекарство", + "medicationCourseEnd": "{name} завершил(а) курс лекарства", + "medicationDelete": "{name} убрал(а) лекарство", + "medicationGlp1Update": "{name} изменил(а) курс GLP-1", + "medicationScheduleCreate": "{name} добавил(а) расписание приёма", + "medicationScheduleUpdate": "{name} изменил(а) расписание приёма", + "medicationScheduleDelete": "{name} убрал(а) расписание приёма", + "medicationInventoryCreate": "{name} добавил(а) упаковку лекарства", + "medicationInventoryUpdate": "{name} изменил(а) упаковку лекарства", + "medicationInventoryDelete": "{name} убрал(а) упаковку лекарства", + "medicationSideEffectDelete": "{name} убрал(а) побочный эффект", + "medicationIntakeUpdate": "{name} изменил(а) дозу", + "medicationIntakeDelete": "{name} убрал(а) дозу", + "medicationIntakeBulkDelete": "{name} убрал(а) несколько доз сразу", + "medicationIntakePurge": "{name} удалил(а) всю историю доз лекарства", + "medicationIntakeImport": "{name} запустил(а) импорт доз для одного лекарства", + "medicationIntakeHistoryImport": "{name} запустил(а) импорт истории доз", + "moodEntryCreate": "{name} добавил(а) запись настроения", + "moodEntryUpdate": "{name} изменил(а) запись настроения", + "moodEntryDelete": "{name} убрал(а) запись настроения", + "moodDeleteBulk": "{name} убрал(а) несколько записей настроения сразу", + "moodRestore": "{name} восстановил(а) запись настроения", + "mentalHealthCreate": "{name} записал(а) результат опросника", + "cycleDelete": "{name} убрал(а) цикл", + "cycleDayLogUpsert": "{name} записал(а) день цикла", + "cycleDayLogUpdate": "{name} изменил(а) день цикла", + "cycleDayLogDelete": "{name} убрал(а) день цикла", + "cyclePeriodBoundary": "{name} изменил(а) начало или конец менструации", + "cycleSymptomCreate": "{name} добавил(а) симптом цикла", + "nutrientWaterWrite": "{name} записал(а) приём воды", + "healthRecordExport": "{name} экспортировал(а) запись", + "rejectedMeasurementQuery": "{name} отправил(а) поиск измерений, который эта запись не смогла прочитать", + "rejectedDoseQuery": "{name} отправил(а) поиск доз, который эта запись не смогла прочитать", + "rejectedMoodQuery": "{name} отправил(а) поиск настроения, который эта запись не смогла прочитать", + "rejectedMeasurementCreate": "{name} попытался(ась) добавить измерение, и было отказано", + "rejectedMeasurementBatch": "{name} попытался(ась) добавить несколько измерений, и было отказано", + "rejectedMeasurementUpdate": "{name} попытался(ась) изменить измерение, и было отказано", + "rejectedLabCreate": "{name} попытался(ась) добавить результат анализа, и было отказано", + "rejectedLabUpdate": "{name} попытался(ась) изменить результат анализа, и было отказано", + "rejectedBiomarkerCreate": "{name} попытался(ась) добавить показатель, и было отказано", + "rejectedBiomarkerUpdate": "{name} попытался(ась) изменить показатель, и было отказано", + "rejectedReminderCreate": "{name} попытался(ась) добавить напоминание об измерении, и было отказано", + "rejectedReminderUpdate": "{name} попытался(ась) изменить напоминание об измерении, и было отказано", + "rejectedMoodCreate": "{name} попытался(ась) добавить запись настроения, и было отказано", + "rejectedMoodUpdate": "{name} попытался(ась) изменить запись настроения, и было отказано", + "rejectedDoseCreate": "{name} попытался(ась) записать дозу, и было отказано", + "rejectedDoseUpdate": "{name} попытался(ась) изменить дозу, и было отказано", + "rejectedDoseImport": "{name} попытался(ась) импортировать дозы, и было отказано", + "rejectedTrackedValue": "{name} попытался(ась) записать отслеживаемое значение, и было отказано", + "rejectedTrackedValueTypeCreate": "{name} попытался(ась) добавить тип отслеживаемого значения, и было отказано", + "rejectedTrackedValueTypeUpdate": "{name} попытался(ась) изменить тип отслеживаемого значения, и было отказано", + "rejectedMedicationLayout": "{name} попытался(ась) изменить порядок списка лекарств, и было отказано", + "deniedDoseImport": "Импорт доз, запущенный {name}, не удалось поставить в очередь", + "anamnesisFactCreate": "{name} добавил(а) факт медицинского фона", + "customMetricCreate": "{name} добавил(а) тип отслеживаемого значения", + "customMetricUpdate": "{name} изменил(а) тип отслеживаемого значения", + "customMetricDelete": "{name} убрал(а) тип отслеживаемого значения", + "documentStore": "{name} добавил(а) документ", + "documentUpdate": "{name} изменил(а) документ", + "documentDiscard": "{name} отбросил(а) документ", + "medicationIntakeImportFinished": "Импорт доз, запущенный {name}, завершён", + "medicationOneShotReconciled": "Однократное лекарство было открыто или закрыто после дозы, записанной {name}", + "vaccinationBoosterPlanned": "{name} запланировал(а) ревакцинацию", + "medicationCategoryCreate": "{name} добавил(а) категорию лекарств", + "symptomEventCreate": "{name} записал(а) симптом", + "symptomEventUpdate": "{name} изменил(а) запись симптома", + "symptomEventDelete": "{name} удалил(а) запись симптома", + "symptomDefinitionCreate": "{name} добавил(а) симптом", + "symptomDefinitionUpdate": "{name} изменил(а) симптом", + "symptomDefinitionDelete": "{name} убрал(а) симптом", + "customVaccineCreate": "{name} добавил(а) собственную вакцину", + "customVaccineUpdate": "{name} изменил(а) собственную вакцину", + "customVaccineDelete": "{name} убрал(а) собственную вакцину", + "lifeEventCreate": "{name} добавил(а) событие жизни", + "lifeEventUpdate": "{name} изменил(а) событие жизни", + "lifeEventDelete": "{name} убрал(а) событие жизни", + "biomarkerMerge": "{name} объединил(а) показатели", + "medicationIngredientsUpdate": "{name} изменил(а) состав добавки", + "auditCCreate": "{name} ответил(а) на вопросы AUDIT-C", + "auditCDelete": "{name} убрал(а) запись AUDIT-C" + }, + "section": { + "measurements": { + "label": "Измерения", + "detail": "Вес, АД, пульс, глюкоза, сон, тренировки и значения, которые вы отслеживаете." + }, + "medications": { + "label": "Лекарства", + "detail": "Список лекарств, их расписания, принятые дозы, побочные эффекты и запас." + }, + "labs": { + "label": "Результаты анализов", + "detail": "Результаты анализов и список показателей за ними." + }, + "profile": { + "label": "Медицинский фон", + "detail": "Аллергии, семейный анамнез, факты в вашем профиле здоровья, ваши визиты и клиники, а также запись о вакцинации." + }, + "illness": { + "label": "Заболевания", + "detail": "Эпизоды заболеваний и дневные записи под ними." + }, + "mind": { + "label": "Настроение и психика", + "detail": "Записи настроения и история опросников психического благополучия. Завершённый опросник также сохраняет свой итоговый балл как измерение." + }, + "cycle": { + "label": "Цикл", + "detail": "Отслеживание цикла." + }, + "documents": { + "label": "Документы", + "detail": "Всё, что хранится в хранилище документов." + } + }, + "actionError": { + "retry": "Попробовать ещё раз", + "offline": "Это не дошло до сервера. Ничего не изменилось. Проверьте подключение и попробуйте ещё раз.", + "rateLimited": "Слишком много попыток подряд. Подождите минуту и попробуйте ещё раз.", + "acceptExpired": "Это приглашение истекло. Попросите новое.", + "acceptWithdrawn": "Это приглашение было отозвано.", + "acceptNotPending": "Это приглашение уже принято.", + "acceptNotFound": "Этого приглашения больше нет.", + "acceptFailed": "Приглашение не удалось принять.", + "lastGuardian": "Это единственный человек, который следит за тем профилем, поэтому этот доступ пока нельзя завершить. Сначала добавьте другого опекуна или удалите профиль.", + "alreadyEnded": "Этот доступ уже завершён.", + "notFound": "Этого доступа больше нет.", + "revokeFailed": "Доступ не удалось завершить.", + "renounceFailed": "Доступ не удалось вернуть.", + "profileNotFound": "Этого профиля больше нет. Возможно, он уже удалён или ваш доступ к нему завершён.", + "deleteProfileFailed": "Профиль не удалось удалить.", + "removeGuardianFailed": "Этот доступ не удалось завершить." + }, + "anamnesis": { + "relativeNote": "Запись семейного анамнеза описывает родственников этого человека. Добавляйте её, только если они хотели бы, чтобы она была записана здесь." + }, + "handoverDecision": { + "title": "У кого останется доступ к вашей записи", + "description": "Решите, что люди, которые следили за вашей записью, могут делать с этого момента.", + "proposed": "Предложено: {access}", + "settled": "Уже изменено в разделе «Общий доступ»", + "empty": "Больше ни у кого не было доступа к вашей записи.", + "later": "Вы можете изменить это в любой момент в разделе «Настройки, Общий доступ».", + "save": "Подтвердить", + "saving": "Сохранение…", + "decideLater": "Позже", + "errorFailed": "Ваше решение не удалось сохранить. Попробуйте ещё раз.", + "loadError": "Ваших прежних опекунов не удалось загрузить.", + "notificationsTitle": "Настройте свои напоминания", + "notificationsBody": "Напоминания для этой записи раньше приходили людям, которые за ней следили. Теперь они приходят вам, как только вы добавите канал уведомлений.", + "notificationsAction": "Открыть настройки уведомлений" + } + }, + "encounters": { + "kind": { + "routine": "Плановый визит", + "acute": "Визит по острому состоянию", + "specialist": "Визит к специалисту", + "preventive": "Профилактический осмотр", + "emergency": "Экстренная помощь", + "hospital": "Больница", + "therapy": "Сеанс терапии", + "other": "Приём", + "procedure": "Процедура или операция" + }, + "laterality": { + "left": "Слева", + "right": "Справа", + "both": "С обеих сторон", + "none": "Не указано" + }, + "bodySiteWithSide": "{site} ({side})", + "sectionTitle": "Визиты", + "sectionDescription": "Визиты к врачу и запланированные приёмы в одном месте.", + "add": "Визит", + "loadError": "Визиты не удалось загрузить.", + "emptyTitle": "Пока нет ни одного визита", + "emptyDescription": "Достаточно даты. Всё остальное необязательно.", + "upcomingHeading": "Предстоящие", + "pastHeading": "Прошедшие", + "createTitle": "Записать визит", + "editTitle": "Изменить визит", + "formDescription": "Обязательна только дата.", + "created": "Визит сохранён", + "updated": "Визит обновлён", + "saveFailed": "Визит не удалось сохранить.", + "checkupNotClosed": "Визит сохранён. Осмотр остаётся открытым; ваш доступ этого не охватывает.", + "status": { + "planned": "Запланировано", + "done": "Посещено", + "cancelled": "Отменено", + "noShow": "Пропущено" + }, + "card": { + "documentCount": "связанных документов", + "labCount": "связанных результатов анализов", + "conditionCount": "связанных состояний" + }, + "form": { + "date": "Дата и время", + "dateDerivesStatusHint": "Дата в будущем — это запланированный приём.", + "status": "Статус", + "practitioner": "Клиника или врач", + "practitionerHint": "Необязательно: имя можно добавить позже.", + "practitionerNone": "Не указано", + "practitionerSearch": "Поиск по имени или клинике", + "practitionerNoMatch": "Запись не найдена.", + "practitionerAdd": "Добавить новую", + "practitionerClear": "Снять выделение", + "kind": "Вид", + "reason": "Причина", + "outcome": "Исход", + "outcomeReveal": "Добавить исход", + "bodySite": "Область тела", + "bodySiteHint": "Например, колено или желчный пузырь.", + "laterality": "Сторона", + "linkDocuments": "Документы", + "linkLabResults": "Результаты анализов", + "linkConditions": "Состояния", + "linkNothingToOffer": "Пока нечего связать." + }, + "deleteTitle": "Удалить этот визит?", + "deleteDescription": "Запись удаляется. Если визит запланирован, его напоминание прекращается вместе с ним.", + "deleteFailed": "Визит не удалось удалить.", + "suggestion": { + "single": "Это относится к этому визиту?", + "choose": "К какому визиту это относится?" + }, + "episodeCard": { + "title": "Визиты по этому", + "emptyLine": "С этим состоянием пока не связано ни одного визита.", + "add": "Добавить визит" + }, + "dashboard": { + "nextVisit": "Следующий приём: {what} {when}" + }, + "procedures": { + "title": "Процедуры и операции", + "description": "Каждая процедура и операция, которые у вас были, сначала новые.", + "add": "Процедура", + "searchLabel": "Фильтр по области тела", + "searchPlaceholder": "Например, колено", + "sitesLabel": "Области тела", + "allSites": "Все", + "count": "{shown} из {total}", + "emptyTitle": "Пока нет ни одной процедуры", + "emptyDescription": "Запишите визит вида «Процедура или операция» или переключите существующий визит на него.", + "noMatchTitle": "Ничего не соответствует этому фильтру", + "clearFilter": "Очистить фильтр", + "loadError": "Процедуры не удалось загрузить." + }, + "preparation": { + "practitioner": "С вашего последнего визита к {name} {date}", + "specialty": "С вашего последнего визита к специалисту «{specialty}» {date}", + "kind": "С вашего последнего визита того же вида ({kind}) {date}", + "default": "Последние {days} дней", + "defaultReason": "Нет более раннего визита с той же клиникой, специальностью или видом." + } + }, + "checkups": { + "viewSwitchLabel": "Показать осмотры, визиты, процедуры или области тела", + "tabVorsorge": "Осмотры", + "tabVisits": "Визиты", + "tabProcedures": "Процедуры", + "tabBodySites": "Области тела" + }, + "practitioners": { + "title": "Клиники и врачи", + "description": "Ваша собственная адресная книга: введите клинику один раз, выбирайте её везде.", + "linkLabel": "Адресная книга", + "searchPlaceholder": "Поиск по имени, клинике или специальности", + "loadError": "Адресную книгу не удалось загрузить.", + "emptyTitle": "Пока нет ни одной записи", + "emptyDescription": "Добавьте клинику, чтобы выбирать её при записи визита.", + "noMatchTitle": "Нет совпадений", + "noMatchDescription": "Ни одна запись не соответствует этому поиску.", + "createTitle": "Добавить запись", + "editTitle": "Изменить запись", + "formDescription": "Обязательно только имя.", + "name": "Имя", + "specialty": "Специальность", + "practice": "Клиника", + "location": "Адрес", + "phone": "Телефон", + "note": "Заметка", + "noteHint": "Хранится в зашифрованном виде.", + "saveFailed": "Запись не удалось сохранить.", + "deleteTitle": "Удалить эту запись?", + "deleteDescription": "Ваши существующие визиты остаются, и они сохраняют это имя.", + "deleteFailed": "Запись не удалось удалить.", + "noSpecialtyGroup": "Без специальности" + }, + "links": { + "picker": { + "add": "Добавить", + "done": "Готово", + "selectAll": "Выбрать все", + "searchPlaceholder": "Поиск", + "searchNoMatch": "Нет совпадений", + "suggested": "Вокруг этой даты", + "loadError": "Список не удалось загрузить.", + "removeNamed": "Убрать {name}", + "removed": "{name} отвязано", + "linked": "Связано", + "loadNewer": "Загрузить более новые", + "loadOlder": "Загрузить более старые", + "period": { + "showing": "Показан период {period}" + } + }, + "related": { + "title": "Связанное", + "kind": { + "labResult": "Результат анализа", + "encounter": "Визит", + "document": "Документ", + "conditionEpisode": "Состояние", + "medication": "Лекарство", + "vaccination": "Вакцинация" + }, + "via": { + "encounter": "через визит", + "efficacyTarget": "через цель эффективности" + }, + "pick": { + "conditionEpisode": "Состояния", + "document": "Документы", + "encounter": "Визиты", + "medication": "Лекарства", + "vaccination": "Вакцинации" + }, + "nothingToOffer": "Пока нечего связать.", + "saveError": "Связь не удалось сохранить." + } + }, + "bodySites": { + "title": "Области тела", + "description": "Процедуры и состояния по тому, где на теле они находятся.", + "loadError": "Области тела не удалось загрузить.", + "emptyTitle": "Пока нет ни одной области тела", + "emptyDescription": "Добавьте область тела к процедуре или состоянию, и она появится здесь.", + "sitesLabel": "Области тела", + "sidesLabel": "Сторона", + "allSides": "Все стороны", + "pickPrompt": "Выберите область, чтобы увидеть, что к ней относится.", + "noMatchTitle": "На этой стороне ничего не записано", + "visitsTitle": "Процедуры и визиты", + "conditionsTitle": "Состояния", + "hiddenDocument": "Документ, не открытый вам", + "hiddenLabResult": "Результат анализа, не открытый вам", + "hiddenCondition": "Состояние, не открытое вам", + "hiddenVisit": "Визит, не открытый вам", + "linkedLabel": "Связанные записи", + "conditionSince": "С {onset}", + "conditionDates": "{onset} — {resolved}" + }, + "aiRuns": { + "backgroundDocument": "Чтение в фоне. Вы можете покинуть эту страницу; результат сохранится вместе с документом.", + "backgroundScan": "Чтение в фоне. С медленной моделью это может занять несколько минут.", + "waitingForWorker": "Ожидание фонового обработчика. Если это не меняется, возможно, обработчик сервера не запущен.", + "errorWorkerUnavailable": "Фоновый обработчик сейчас недоступен. Попробуйте через минуту или попросите оператора сервера проверить его.", + "errorTimedOut": "Чтение заняло больше времени, чем допускает ваше время ответа ИИ. Попробуйте ещё раз или увеличьте время ответа в настройках ИИ.", + "errorReaderBusy": "Средство чтения документов занято другой работой. Попробуйте через минуту." + }, + "symptoms": { + "add": "Новый симптом", + "nameLabel": "Название", + "namePlaceholder": "например, Аура", + "iconLabel": "Значок", + "icons": { + "Tag": "Тег", + "Activity": "Активность", + "Heart": "Сердце", + "HeartPulse": "Пульс", + "Brain": "Мозг", + "Zap": "Молния", + "Flame": "Пламя", + "Snowflake": "Снежинка", + "Droplet": "Капля", + "CircleDot": "Точка", + "BatteryLow": "Низкий заряд", + "MoonStar": "Луна и звезда", + "PersonStanding": "Человек", + "Drama": "Маски", + "Frown": "Хмурое лицо", + "Cookie": "Печенье", + "Soup": "Суп", + "Pill": "Таблетка", + "Thermometer": "Термометр", + "Stethoscope": "Стетоскоп" + }, + "limitReached": "У вас 8 симптомов. Скрывайте один, чтобы добавить другой.", + "saveError": "Симптом не удалось сохранить. Попробуйте ещё раз.", + "nameRequired": "Дайте симптому название.", + "unreadableLabel": "Нечитаемый симптом", + "intensityPill": "{value}/10", + "entry": { + "sheetDescription": "Один из ваших собственных симптомов, насколько сильный и когда.", + "symptom": "Симптом", + "symptomRequired": "Выберите симптом.", + "intensity": "Интенсивность", + "intensityRequired": "Укажите, насколько сильным он был.", + "intensityUnset": "Не задано", + "anchorLow": "Нет", + "anchorHigh": "Худшее, что можно представить", + "intensityValueText": "{value} из {max} ({low} — {high})", + "when": "Когда", + "during": "Во время заболевания", + "duringNone": "Не связано", + "note": "Заметка", + "notePlaceholder": "Что ещё происходило?", + "reset": "Сбросить форму", + "emptyHint": "Добавьте свой первый симптом, например ауру или головную боль.", + "emptyHintNoManage": "Для этой записи пока не настроено ни одного симптома.", + "limitHint": "До {limit} симптомов. Скрывайте один на странице заболеваний, чтобы добавить другой." + }, + "section": { + "title": "Ваши симптомы", + "log": "Записать", + "loadError": "Ваши симптомы не удалось загрузить.", + "summaryOne": "Один раз за 30 дней, {max}/10, последний {date}", + "summaryFew": "{count} раза за 30 дней, до {max}/10, последний {date}", + "summaryOther": "{count} раз за 30 дней, до {max}/10, последний {date}", + "summaryNoneRecent": "Не за последние 30 дней, последний {date}", + "summaryNever": "Пока не записан", + "menuLabel": "Действия для {symptom}", + "eventMenuLabel": "Действия для этой записи {symptom}", + "hide": "Скрыть", + "show": "Показать снова", + "deleteTitle": "Удалить симптом?", + "deleteBody": "«{symptom}» и каждая его запись будут удалены. Чтобы сохранить историю, скройте его вместо этого.", + "deleteEventTitle": "Удалить запись?", + "deleteEventBody": "Эта запись будет удалена.", + "hiddenOne": "Скрыто (1)", + "hiddenFew": "Скрыто ({count})", + "hiddenOther": "Скрыто ({count})", + "recent": "Последние 30 дней", + "recentEmpty": "За последние 30 дней ничего не записано.", + "editEventTitle": "Изменить {symptom}", + "editSymptomTitle": "Изменить симптом" + }, + "episode": { + "title": "Записанные симптомы", + "during": "во время {illness}" + } + }, + "day": { + "scoreOfMax": "из {max}", + "cycleDay": "День цикла {n}", + "cyclePhaseLine": { + "MENSTRUAL": "День цикла {n}, менструальная фаза", + "FOLLICULAR": "День цикла {n}, фолликулярная фаза", + "OVULATORY": "День цикла {n}, овуляторная фаза", + "LUTEAL": "День цикла {n}, лютеиновая фаза" + }, + "previousDay": "Предыдущий день", + "nextDay": "Следующий день", + "close": "Закрыть день", + "hidePanel": "Скрыть день", + "showPanel": "Показать {date}", + "openDay": "Открыть день", + "viewWholeDay": "Показать весь день", + "captureForDay": "Добавить за этот день", + "empty": "За этот день нет записей.", + "notShared": "Некоторые разделы не открыты вам.", + "inTimeline": "В хронологии", + "askCoach": "Спросить тренера об этом дне", + "loadFailed": "Этот день не удалось загрузить.", + "dayOf": "День {n} из {m}", + "dayN": "День {n}", + "usualRange": "Обычно {lo} — {hi}", + "groups": { + "scores": "Баллы", + "running": "Действует в этот день", + "values": "Значения", + "happened": "Что произошло", + "movement": "В движении" + }, + "notable": { + "extremeHigh": "Самое высокое дневное значение с {since}", + "extremeLow": "Самое низкое дневное значение с {since}", + "firstValue": "Первое измерение такого рода", + "gap": "Нет измерений {days} дней" + }, + "previousDayShortcut": "Предыдущий день (Alt + стрелка влево)", + "nextDayShortcut": "Следующий день (Alt + стрелка вправо)", + "captureShort": "Записать", + "inTimelineShort": "Хронология", + "askCoachPrompt": "Что произошло {date}?", + "coachChips": "Дни в этом ответе", + "description": "Всё, что ваши записи содержат за этот день.", + "openDocument": "Открыть документ", + "previousReading": "До этого, {date}", + "sheetExpand": "Развернуть на всю высоту", + "sheetShrink": "Свернуть", + "valuesLegend": "Точка — этот день, столбик — 30 дней до него", + "valuesAllOne": "Все значения", + "valuesAllFew": "Все {count} значения", + "valuesAllOther": "Все {count} значений", + "valuesFewer": "Меньше значений", + "countEntriesOne": "1 запись", + "countEntriesFew": "Записей: {count}", + "countEntriesOther": "Записей: {count}", + "meanOfReadingsOne": "Среднее по 1 измерению", + "meanOfReadingsFew": "Среднее по {count} измерениям", + "meanOfReadingsOther": "Среднее по {count} измерениям", + "sinceLastVisit": { + "countOne": "1 запись", + "countFew": "Записей: {count}", + "countOther": "Записей: {count}", + "allOne": "Показать все", + "allFew": "Показать все {count}", + "allOther": "Показать все {count}", + "fewer": "Показать меньше", + "note": "Составлено из ваших записей, без оценок. Каждая дата открывает весь день.", + "report": "Отчёт для врача с {date} по сегодня", + "loadError": "Не удалось загрузить, что произошло с последнего визита." + }, + "travel": "В отъезде", + "event": { + "started": "{label} началось", + "ended": "{label} завершилось", + "paused": "{label} на паузе", + "resumed": "{label} возобновлено", + "illnessBegan": "{label} началось", + "illnessResolved": "{label} завершилось" + }, + "pickDate": "Выберите дату", + "pickerTitle": "Перейти к дню", + "today": "Сегодня", + "hasEntries": "есть записи", + "dayNSince": "День {n}, с {date}", + "sinceDate": "С {date}", + "movement": { + "total": "Расстояние", + "driving": "На машине", + "train": "На поезде", + "places": "Посещённые места", + "away": "Вне дома", + "travel": "День путешествия", + "travelYes": "Да", + "kilometres": "{value} км", + "miles": "{value} миль" + } + }, + "timeline": { + "title": "Хронология", + "subtitle": "Что произошло когда, рядом с вашими значениями.", + "standing": "Продолжается", + "startUnknown": "начало неизвестно", + "zoom": { + "all": "Всё", + "year": "12 месяцев", + "quarter": "3 месяца", + "range": "Диапазон" + }, + "lanes": { + "life": "Жизнь", + "illness": "Состояния", + "allergies": "Аллергии", + "medications": "Лекарства", + "vaccinations": "Вакцинации", + "visits": "Врачи и процедуры", + "labs": "Анализы", + "documents": "Документы", + "cycle": "Цикл" + }, + "readiness": { + "title": "Что ваша хронология уже содержит", + "subtitle": "Честная инвентаризация перед тем, как вы её откроете.", + "menuEntry": "Охват данных", + "hint": "Пустые дорожки остаются скрытыми, пока что-то не появится. Модули, которые вы выключили, никогда не появляются. Этот обзор вы позже найдёте в разделе «Охват данных» в хронологии.", + "later": "Позже", + "open": "Открыть хронологию", + "verdict": { + "carries": "Она уже наполнена.", + "thin": "Пока скудна. Пока хронология показывает в основном ваши значения." + }, + "status": { + "carries": "наполнена", + "thin": "скудна", + "empty": "пусто" + }, + "lanes": { + "values": "Значения", + "mood": "Настроение", + "environment": "Окружающая среда", + "life": "События жизни" + }, + "meter": "{carrying} из {total} дорожек наполнены", + "carriesDetail": "{carrying} из {total} дорожек дают обзор с {since}.", + "loadFailed": "Инвентаризацию не удалось загрузить.", + "card": { + "title": "Что хронология уже содержит", + "summary": "Она уходит назад до {since}; {carrying} из {total} дорожек уже наполнены.", + "dismiss": "Скрыть" + }, + "detail": { + "valuesOne": "{count} показатель с {since}", + "valuesFew": "{count} показателя с {since}", + "valuesOther": "{count} показателей с {since}", + "illnessOne": "{count} эпизод, {chronic} из них хронические", + "illnessFew": "{count} эпизода, {chronic} из них хронические", + "illnessOther": "{count} эпизодов, {chronic} из них хронические", + "allergiesOne": "{count} аллергия", + "allergiesFew": "{count} аллергии", + "allergiesOther": "{count} аллергий", + "medicationsOne": "{count} лекарство, {missingStart} без даты начала", + "medicationsFew": "{count} лекарства, {missingStart} без даты начала", + "medicationsOther": "{count} лекарств, {missingStart} без даты начала", + "medicationsDatedOne": "{count} лекарство с датой начала", + "medicationsDatedFew": "{count} лекарства с датой начала", + "medicationsDatedOther": "{count} лекарств с датой начала", + "vaccinationsOne": "{count} вакцинация", + "vaccinationsFew": "{count} вакцинации", + "vaccinationsOther": "{count} вакцинаций", + "visitsOne": "{count} визит, {procedures} с процедурой", + "visitsFew": "{count} визита, {procedures} с процедурой", + "visitsOther": "{count} визитов, {procedures} с процедурой", + "visitsPlannedOne": "{count} визит, только запланирован", + "visitsPlannedFew": "{count} визита, только запланированы", + "visitsPlannedOther": "{count} визитов, только запланированы", + "labsOne": "{count} день с результатами", + "labsFew": "{count} дня с результатами", + "labsOther": "{count} дней с результатами", + "documentsOne": "{count} документ с датой", + "documentsFew": "{count} документа с датой", + "documentsOther": "{count} документов с датой", + "lifeOne": "{count} событие жизни", + "lifeFew": "{count} события жизни", + "lifeOther": "{count} событий жизни", + "cycleOne": "{count} цикл", + "cycleFew": "{count} цикла", + "cycleOther": "{count} циклов", + "moodOne": "{count} запись с {since}", + "moodFew": "{count} записи с {since}", + "moodOther": "{count} записей с {since}", + "environmentOne": "{count} день с данными об окружающей среде", + "environmentFew": "{count} дня с данными об окружающей среде", + "environmentOther": "{count} дней с данными об окружающей среде", + "empty": "Пока ничего" + }, + "gap": { + "valuesEmpty": "Подключите источники", + "illnessEmpty": "Добавьте эпизод", + "medicationsWithoutStart": "Дополните", + "visitsEmpty": "Добавьте визит", + "documentsUndated": "Проверьте", + "labsEmpty": "Добавьте результат", + "vaccinationsEmpty": "Добавьте вакцинации", + "lifeEventsEmpty": "Добавьте" + }, + "gapLine": { + "medicationsWithoutStartOne": "{count} лекарство без даты начала", + "medicationsWithoutStartFew": "{count} лекарства без даты начала", + "medicationsWithoutStartOther": "{count} лекарств без даты начала", + "documentsUndatedOne": "{count} документ без даты", + "documentsUndatedFew": "{count} документа без даты", + "documentsUndatedOther": "{count} документов без даты", + "valuesEmpty": "Пока нет значений за более длительный период", + "illnessEmpty": "Пока нет состояний с датой начала", + "visitsEmpty": "Пока нет завершённых визитов к врачу", + "labsEmpty": "Пока нет результатов анализов", + "vaccinationsEmpty": "Вакцинаций пока нет", + "lifeEventsEmpty": "Событий жизни пока нет" + } + }, + "legendSpan": "Период", + "legendEvent": "Событие", + "legendMeanQuarter": "Среднее за квартал", + "legendMeanMonth": "Среднее за месяц", + "legendMeanWeek": "Среднее за неделю", + "legendThin": "Меньше 3 измерений", + "legendGap": "Короткий перерыв без измерений", + "today": "Сегодня", + "noDataYet": "Данных пока нет", + "layers": "Слои", + "layersLanes": "Дорожки", + "zoomLabel": "Диапазон просмотра", + "chartLabel": "Хронология с {from} по {to}", + "keyboardHint": "Стрелки перемещают выделение, Home и End переходят к любому краю, Enter открывает день.", + "loadFailed": "Хронологию не удалось загрузить.", + "empty": { + "title": "В хронологии пока ничего нет", + "description": "Записи с датой появятся здесь, как только они будут." + }, + "values": { + "menuTitle": "Значения под дорожками", + "trigger": "Значения ({count})", + "noneInWindow": "В этом диапазоне нет значений", + "series": { + "BLOOD_PRESSURE_SYS": "АД систолическое", + "BLOOD_PRESSURE_DIA": "АД диастолическое" + }, + "noValue": "нет значения", + "bloodPressure": "АД", + "readingsOne": "1 измерение", + "readingsFew": "среднее по {count} измерениям", + "readingsOther": "среднее по {count} измерениям" + }, + "table": { + "caption": "Записи хронологии", + "lane": "Дорожка", + "entry": "Запись", + "start": "Начало", + "end": "Конец", + "seriesCaption": "Средние значения по периодам", + "period": "Период", + "labsCaption": "Результаты анализов по дням", + "marker": "Показатель", + "date": "Дата", + "value": "Значение" + }, + "selection": { + "empty": "В этом периоде нет записей", + "since": "с {date}", + "range": "с {from} по {to}", + "mean": "Ø {values}", + "week": "Неделя с {date}", + "hintClick": "Нажмите на точку во времени, чтобы увидеть её здесь", + "hintTap": "Коснитесь точки во времени, чтобы увидеть её здесь" + }, + "chronicle": { + "months": "Месяцы", + "years": "Годы", + "groupingLabel": "Группировка", + "empty": "Нет записей с {from} по {to}", + "emptySingle": "Нет записей в {period}", + "ended": "{label} завершено", + "afterDaysOne": "через 1 день", + "afterDaysFew": "через {count} дня", + "afterDaysOther": "через {count} дней", + "notable": { + "extremeHigh": "Самое высокое значение за долгое время", + "extremeLow": "Самое низкое значение за долгое время", + "firstValue": "Первое значение показателя", + "gap": "Более длинный перерыв в значениях" + }, + "notableMeta": "Откройте день, чтобы увидеть подробности" + }, + "standingAllergiesOne": "{count} аллергия", + "standingAllergiesFew": "{count} аллергии", + "standingAllergiesOther": "{count} аллергий", + "legendMeanDay": "Среднее за день", + "range": { + "from": "С", + "to": "По", + "label": "Выбранный диапазон", + "open": "Выбрать диапазон", + "clear": "Показать всё", + "apply": "Применить" + }, + "item": { + "labValuesOne": "1 результат анализа", + "labValuesFew": "{count} результата анализов", + "labValuesOther": "{count} результатов анализов" + }, + "labs": { + "menuTitle": "Лабораторные показатели", + "otherPanel": "Другое", + "full": "До {max} результатов анализов одновременно. Уберите один, чтобы добавить другой.", + "above": "выше диапазона", + "below": "ниже диапазона", + "reference": "референсный диапазон {range}", + "report": "Отчёт: {title}", + "reportUntitled": "Открыть отчёт", + "excludedOne": "{name}: {count} значение в другой единице не отображается", + "excludedFew": "{name}: {count} значения в другой единице не отображаются", + "excludedOther": "{name}: {count} значений в другой единице не отображаются" + }, + "legendLabValue": "Результат анализа, как измерено", + "legendLabOutside": "Вне референсного диапазона", + "legendLabRange": "Референсный диапазон" + }, + "lifeEvents": { + "title": "Событие жизни", + "add": "Событие жизни", + "privacy": "Название и заметка хранятся в зашифрованном виде. Они не передаются ИИ.", + "emptyHint": "Переезд, рождение ребёнка или новая работа дают годам опору.", + "save": "Сохранить", + "cancel": "Отмена", + "delete": "Удалить событие жизни", + "saved": "Событие жизни сохранено", + "deleted": "Событие жизни удалено", + "fields": { + "title": "Что произошло?", + "category": "Вид", + "when": "Когда", + "precision": "Точность", + "addEnd": "Дата окончания, если это был период", + "endDate": "До", + "note": "Заметка", + "optionalTag": "необязательно", + "notePlaceholder": "То, что вы захотите вспомнить позже", + "removeEnd": "Убрать дату окончания" + }, + "category": { + "FAMILY": "Семья", + "HOME": "Дом", + "WORK": "Работа", + "LOSS": "Утрата", + "OTHER": "Другое" + }, + "precision": { + "DAY": "День", + "MONTH": "Месяц", + "YEAR": "Год" + }, + "edit": "Изменить событие жизни", + "errors": { + "titleRequired": "Дайте событию название.", + "titleTooLong": "Не более 120 символов.", + "categoryRequired": "Выберите вид.", + "dateRequired": "Введите корректную дату.", + "endBeforeStart": "Окончание раньше начала.", + "noteTooLong": "Не более 2000 символов." + }, + "saveFailed": "Сохранить не удалось.", + "deleteFailed": "Удалить не удалось.", + "deleteConfirm": { + "title": "Удалить это событие жизни?", + "body": "Его название и заметка будут потеряны." + } + }, + "palette": { + "title": "Поиск", + "description": "Найдите страницу, настройку, модуль, действие или запись в своих данных.", + "placeholder": "Поиск по страницам, настройкам, записям…", + "results": "Результаты", + "noResults": "По запросу «{query}» ничего не найдено.", + "moduleOn": "Вкл.", + "moduleOff": "Выкл.", + "hintMove": "Переместить", + "hintOpen": "Открыть", + "hintClose": "Закрыть", + "groups": { + "recent": "Недавние", + "pages": "Страницы", + "insights": "Аналитика", + "settings": "Настройки", + "modules": "Модули", + "actions": "Действия", + "records": "В ваших записях" + }, + "actions": { + "capture": "Новая запись", + "coach": "Спросить Coach", + "backup": "Создать резервную копию", + "today": "Открыть сегодня", + "shortcuts": "Показать сочетания клавиш" + }, + "records": { + "loading": "Поиск по вашим записям…", + "empty": "В ваших записях нет ничего по запросу «{query}».", + "error": "Не удалось выполнить поиск по вашим записям. Попробуйте через минуту.", + "truncated": "Поиск выполнен только по последним записям.", + "kind": { + "visit": "Визит", + "condition": "Состояние", + "document": "Документ", + "vaccination": "Вакцинация", + "lab": "Результат анализа", + "medication": "Лекарство", + "symptom": "Симптом", + "workout": "Тренировка", + "note": "Заметка" + }, + "source": { + "mood": "Заметка к настроению", + "measurement": "Заметка к измерению", + "illness": "Дневник заболевания" + } + } + }, + "shortcuts": { + "title": "Сочетания клавиш", + "description": "Клавиши работают в любом месте приложения, кроме ввода в поле.", + "menuEntry": "Сочетания клавиш", + "then": "затем", + "search": "Поиск", + "help": "Показать этот список", + "close": "Закрыть диалог или панель", + "previousDay": "Предыдущий день", + "nextDay": "Следующий день", + "toggleDay": "Открыть или закрыть день", + "dayHint": "Предыдущий и следующий день работают, пока открыт день.", + "groups": { + "navigation": "Навигация", + "actions": "Действия", + "day": "День" + } + }, + "aboutPage": { + "eyebrow": "О приложении", + "title": "О HealthLog", + "lastUpdated": "Последнее обновление: {date}", + "project": "Проект", + "credits": "Благодарности" + }, + "series": { + "reference": { + "targetUpper": "Ваша цель, верхняя граница", + "targetLower": "Ваша цель, нижняя граница", + "clinicalUpper": "Клиническая верхняя граница", + "clinicalLower": "Клиническая нижняя граница" + } + }, + "activityCalendar": { + "title": "Календарь активности", + "periodLabel": "Охват календаря", + "period": { + "week": "Неделя", + "month": "Месяц" + }, + "weekRange": "с {start} по {end}", + "previous": "Предыдущий период", + "next": "Следующий период", + "metricLabel": "Раскрасить дни по", + "metric": { + "steps": "Шаги", + "activeMinutes": "Активные минуты", + "load": "Тренировочная нагрузка" + }, + "empty": "В этом периоде пока нет шагов, активных минут или тренировок.", + "loadError": "Календарь активности не удалось загрузить.", + "weekGoalsColumn": "Недельные цели", + "weekGoalsMet": "Все недельные цели достигнуты", + "weekGoalsNotMet": "Не все недельные цели достигнуты", + "cell": { + "steps": "{value} шагов", + "activeMinutes": "{value} активных минут", + "workouts": "{value} тренировок: {sports}" + }, + "level": { + "none": "Нет данных", + "unrated": "Пока мало истории", + "low": "Гораздо ниже обычного", + "below": "Ниже обычного", + "usual": "Примерно как обычно", + "above": "Выше обычного", + "high": "Гораздо выше обычного", + "in_progress": "Сегодня, ещё продолжается" + }, + "legend": "В сравнении с вашими предыдущими 12 неделями:", + "noBaseline": "Ваш обычный диапазон появится после 14 дней с данными.", + "summary": { + "steps": "{value} шагов", + "activeMinutes": "{value} активных минут", + "workouts": "{value} тренировок", + "load": "Средняя нагрузка тренировок {value}", + "usual": "Ваше обычное значение к этому моменту: {value}", + "noUsual": "Пока недостаточно прошлых недель или месяцев для сравнения.", + "usualThroughYesterday": "До вчерашнего дня {value}, ваше обычное к этому моменту {usual}", + "firstDay": "Сравнение с вашим обычным появится после окончания первого дня." + }, + "sportCount": "{sport}: {count}", + "goal": { + "workoutsPerWeek": "Тренировок в неделю", + "activeMinutesPerWeek": "Активных минут в неделю", + "stepsPerWeek": "Шагов в неделю", + "stepsPerMonth": "Шагов в месяц" + }, + "goalOf": "{value} из {target}", + "setGoals": "Задать цели", + "editGoals": "Изменить цели", + "goalsSheet": { + "title": "Цели активности", + "description": "Оставьте поле пустым, если цель не нужна.", + "none": "Без цели", + "invalid": "Целое число от {min} до {max}.", + "saveError": "Цели не удалось сохранить." + }, + "crossLink": { + "title": "Календарь активности", + "body": "Ваши шаги за неделю или месяц в сравнении с вашим обычным.", + "cta": "Открыть календарь" + } + }, + "sourceProvenance": { + "title": "Откуда берутся значения", + "description": "Какой источник передал показатель в каждый день и какой из них использует ваш приоритет источников.", + "metric": "Показатель", + "day": "День", + "dayTitle": "Источники в этот день", + "loadError": "Источники не удалось загрузить.", + "dayEmpty": "В этот день нет измерений этого показателя.", + "reason": { + "only_source": "{source} — единственный источник в этот день.", + "highest_on_ladder": "Используется {source}: среди источников этого дня он выше всех в вашем приоритете источников.", + "name_tiebreak": "Используется {source}: ни один из источников этого дня нет в вашем приоритете источников, поэтому решило название.", + "not_ranked": "У этого показателя нет приоритета источников: учитываются измерения всех источников." + }, + "pass": { + "lower_on_ladder": "Ниже в вашем приоритете источников.", + "not_on_ladder": "Нет в вашем приоритете источников для этого показателя.", + "name_tiebreak": "Тот же ранг, что у использованного источника; решило название." + }, + "used": "Использован", + "readings": "{count} измерений, устройства: {devices}", + "ladder": "Ваш порядок для этого показателя: {ladder}", + "utcNote": "Источник выбирается по дню с полуночи до полуночи UTC, так же как его выбирают графики.", + "openSettings": "Изменить порядок в разделе «Приоритет источников»", + "compareTitle": "Сравнить два источника", + "range": "Диапазон", + "rangeDays": "Дней: {days}", + "compareNeedsTwo": "В этом диапазоне измерения этого показателя есть только у одного источника.", + "side": { + "a": "Первый источник", + "b": "Второй источник" + }, + "daysBoth": "Дни с обоими", + "meanOf": "Среднее от {source}", + "meanAbsDiff": "Средняя разница", + "pickedDays": "Использовано дней (первый / второй)", + "pickedSplit": "{a} / {b}", + "compareNote": "Средние охватывают только дни, которые есть у обоих источников, поэтому сравнение идёт с сопоставимым. Значение, выделенное жирным, — то, которое используют графики.", + "settingsHint": "Чтобы увидеть, что этот порядок решает день за днём:", + "settingsHintLink": "Откуда берутся значения", + "metricLink": "Откуда берутся эти значения" + }, + "recordImport": { + "title": "Результаты анализов и лекарства из таблицы", + "description": "Перенесите годы результатов анализов или список лекарств из файла CSV.", + "detail": "Вы выбираете, что в каком столбце, HealthLog сначала проверяет каждую строку и ничего не импортирует до вашего подтверждения. Строки, уже имеющиеся в ваших записях, пропускаются.", + "kind": { + "labs": "Результаты анализов", + "medications": "Лекарства" + }, + "sheetTitle": { + "labs": "Импорт результатов анализов", + "medications": "Импорт лекарств" + }, + "sheetDescription": { + "labs": "Показатели сопоставляются с вашими, единицы переводятся там, где перевод известен.", + "medications": "Название, доза, время приёма, по потребности, начало и конец. Другие ритмы вы настроите в приложении позже." + }, + "file": "Файл CSV", + "template": "Скачать шаблон", + "mapping": "Что в каком столбце", + "required": "(обязательно)", + "notInFile": "Нет в файле", + "column": "Столбец {n}", + "delimiter": "Разделитель", + "delimiterOption": { + "comma": "Запятая", + "semicolon": "Точка с запятой", + "tab": "Табуляция" + }, + "decimal": "Десятичный знак", + "decimalOption": { + "dot": "Точка (5.4)", + "comma": "Запятая (5,4)" + }, + "dateOrder": "Формат даты", + "dateOrderOption": { + "iso": "2025-03-01", + "dmy": "01.03.2025 (сначала день)", + "mdy": "03/01/2025 (сначала месяц)" + }, + "header": "Первая строка содержит названия столбцов", + "reminders": "Включить напоминания для импортированных лекарств", + "timezoneNote": "Время без часового пояса читается в часовом поясе вашего аккаунта. Дата без времени сохраняется как эта календарная дата.", + "missing": "Ещё нужно выбрать: {fields}", + "check": "Проверить файл", + "runIdle": "Импорт", + "run": "Импортировать {count} строк", + "close": "Закрыть", + "summaryCheck": "Прочитано строк: {rows}. Можно импортировать: {inserted}, уже в ваших записях: {duplicates}, с проблемой: {failed}.", + "summaryDone": "Импортировано строк: {inserted}. Пропущено уже в ваших записях: {duplicates}, с проблемой: {failed}.", + "markersMatched": "Сопоставлено с вашими показателями:", + "markersCreated": "Новые показатели:", + "line": "Строка {line}", + "errorsTruncated": "Показаны только первые 500 проблем.", + "error": { + "tooLarge": "Файл больше 16 МБ.", + "rateLimited": "Слишком много импортов за последний час. Попробуйте позже.", + "invalid": "Не удалось прочитать файл или выбор столбцов.", + "failed": "Импорт не прошёл. Попробуйте ещё раз." + }, + "reason": { + "missing_value": "Обязательная ячейка пуста", + "invalid_number": "Не число", + "ambiguous_number": "Число читается двумя способами; проверьте десятичный знак", + "missing_unit": "Для числа нужна единица", + "invalid_date": "Не дата в выбранном порядке", + "invalid_time": "Не время суток", + "ambiguous_date": "Дата читается двумя способами; используйте год из четырёх цифр и выбранный порядок", + "future_date": "Дата в будущем", + "text_too_long": "Текст слишком длинный", + "unit_mismatch": "Эта единица не переводится в единицу показателя", + "invalid_reference_range": "Референсный диапазон не читается", + "invalid_times": "Время не читается (используйте 08:00 20:00)", + "missing_times": "Добавьте время приёма или отметьте лекарство как принимаемое по потребности", + "invalid_yes_no": "Используйте «да» или «нет»", + "as_needed_with_times": "У лекарства по потребности нет фиксированного времени", + "end_before_start": "Окончание раньше начала", + "invalid_medication": "Лекарство нельзя сохранить в таком виде", + "oversized_row": "Строка слишком длинная или слишком широкая", + "row_limit": "Превышен лимит строк для одного импорта", + "duplicate": "Уже в ваших записях, пропущено" + }, + "field": { + "analyte": "Показатель", + "value": "Результат", + "unit": "Единица", + "date": "Дата", + "time": "Время", + "referenceRange": "Референсный диапазон", + "referenceLow": "Нижняя граница референса", + "referenceHigh": "Верхняя граница референса", + "panel": "Панель", + "note": "Заметка", + "name": "Название", + "dose": "Доза", + "times": "Время приёма", + "asNeeded": "По потребности", + "startsOn": "Начало", + "endsOn": "Конец" + } + } +} \ No newline at end of file diff --git a/project.inlang/settings.json b/project.inlang/settings.json index f040a027d..af12cf353 100644 --- a/project.inlang/settings.json +++ b/project.inlang/settings.json @@ -1,7 +1,18 @@ { "$schema": "https://inlang.com/schema/project-settings", "baseLocale": "en", - "locales": ["en", "de", "fr", "es", "it", "pl", "ko", "nl", "pt-BR"], + "locales": [ + "en", + "de", + "fr", + "es", + "it", + "pl", + "ko", + "nl", + "pt-BR", + "ru" + ], "modules": [ "https://cdn.jsdelivr.net/npm/@inlang/plugin-message-format@4.5.5/dist/index.js" ], diff --git a/scripts/generate-i18n-boot.mjs b/scripts/generate-i18n-boot.mjs index 0d7642022..846bfcfd7 100644 --- a/scripts/generate-i18n-boot.mjs +++ b/scripts/generate-i18n-boot.mjs @@ -28,7 +28,7 @@ const __dirname = dirname(fileURLToPath(import.meta.url)); const repoRoot = join(__dirname, ".."); const outDir = join(repoRoot, "public", "i18n"); -const LOCALES = ["de", "en", "fr", "es", "it", "pl", "ko", "nl", "pt-BR"]; +const LOCALES = ["de", "en", "fr", "es", "it", "pl", "ko", "nl", "pt-BR", "ru"]; mkdirSync(outDir, { recursive: true }); diff --git a/src/components/ui/calendar-locale.ts b/src/components/ui/calendar-locale.ts index 87f2f05a3..136775b10 100644 --- a/src/components/ui/calendar-locale.ts +++ b/src/components/ui/calendar-locale.ts @@ -1,4 +1,4 @@ -import { de, enUS, es, fr, it, ko, nl, pl, ptBR } from "date-fns/locale"; +import { de, enUS, es, fr, it, ko, nl, pl, ptBR, ru } from "date-fns/locale"; import type { Locale as DateFnsLocale } from "date-fns"; import type { Locale } from "@/lib/i18n/config"; @@ -27,6 +27,8 @@ export function resolveDateFnsLocale(locale: Locale): DateFnsLocale { return nl; case "pt-BR": return ptBR; + case "ru": + return ru; default: return enUS; } diff --git a/src/lib/ai/citation-coverage.ts b/src/lib/ai/citation-coverage.ts index b4d356719..6f37e3a75 100644 --- a/src/lib/ai/citation-coverage.ts +++ b/src/lib/ai/citation-coverage.ts @@ -178,6 +178,24 @@ const NORMATIVE_KEYWORDS: Record = { "superior a", "inferior a", ], + // Russian replies state a target or a reference interval; the stems carry + // the case endings (целевой/целевого, референсный/референсного), and "выше"/ + // "ниже" are the comparatives a recommendation actually uses. ё folds to е. + ru: [ + "целев", + "цель", + "должн", + "следует", + "рекоменд", + "нормальн", + "норма", + "референс", + "выше", + "ниже", + "больше", + "меньше", + "в пределах", + ], }; /** diff --git a/src/lib/ai/coach/population-norms/index.ts b/src/lib/ai/coach/population-norms/index.ts index 46ff3161f..86eb2430b 100644 --- a/src/lib/ai/coach/population-norms/index.ts +++ b/src/lib/ai/coach/population-norms/index.ts @@ -15,6 +15,7 @@ import { patterns as pl } from "./pl"; import { patterns as nl } from "./nl"; import { patterns as ptBR } from "./pt-br"; import { patterns as ko } from "./ko"; +import { patterns as ru } from "./ru"; export const POPULATION_NORM_PATTERNS: Readonly< Record @@ -28,4 +29,5 @@ export const POPULATION_NORM_PATTERNS: Readonly< nl, "pt-BR": ptBR, ko, + ru, }; diff --git a/src/lib/ai/coach/population-norms/ru.ts b/src/lib/ai/coach/population-norms/ru.ts new file mode 100644 index 000000000..403e7b03a --- /dev/null +++ b/src/lib/ai/coach/population-norms/ru.ts @@ -0,0 +1,11 @@ +/** Population-norm framing, ru. */ +export const patterns: readonly RegExp[] = [ + /\bнормальн\w*\s+(?:диапазон|предел|значени|границ)\w*/i, + /\b(?:референсн|референс)\w*\s+(?:интервал|диапазон|значени|границ)\w*/i, + /\b(?:большинств|все|многие)\s+(?:люд|взросл)\w*/i, + /\b(?:взросл|люд)\w*[^.?!]{0,15}(?:обычно|как\s+правило|в\s+среднем)\b/i, + /\b(?:врач|специалист|эксперт|рекомендаци)\w*[^.?!]{0,20}(?:говор|рекоменду|счита)\w*/i, + /\b(?:общ|широк)\w*\s+(?:популяци|выборк)\w*/i, + /\b(?:средн|типичн|здоров)\w*\s+(?:показател|уровень|значени|норм)\w*/i, + /\bв\s+среднем\s+по\s+популяции\b/i, +]; diff --git a/src/lib/ai/coach/system-prompt.ts b/src/lib/ai/coach/system-prompt.ts index 0159ef2a6..be5001a9f 100644 --- a/src/lib/ai/coach/system-prompt.ts +++ b/src/lib/ai/coach/system-prompt.ts @@ -1258,6 +1258,7 @@ const LOCALE_REPLY_FOOTER_FALLBACK: Record< pl: "\n\nREPLY LANGUAGE: respond in Polish. Mirror the user's register (formal Pan/Pani for medical-adjacent topics); use natural Polish health vocabulary.", nl: "\n\nREPLY LANGUAGE: respond in Dutch. Use the informal je/jij register throughout (never formal u); use natural Dutch health vocabulary.", ko: "\n\nREPLY LANGUAGE: respond in Korean. Use the 해요체 register throughout (never 합쇼체 or plain 한다체); use natural Korean health vocabulary.", + ru: "\n\nREPLY LANGUAGE — THIS OVERRIDES THE LANGUAGE RULE ABOVE. Any \"Respond in English\" instruction earlier in this prompt does NOT apply: respond in Russian (русский язык), address the user with «вы», use natural Russian health vocabulary and the standard Russian lab terminology. Never answer in English.", "pt-BR": "\n\nREPLY LANGUAGE: respond in Brazilian Portuguese (pt-BR, never European Portuguese). Address the user as você throughout; use natural Brazilian health vocabulary.", }; @@ -1297,8 +1298,13 @@ export function getCoachSystemPrompt( base = COACH_PROMPT_DE; } else if (locale === "en") { base = COACH_PROMPT_EN; - } else if (locale === "ko" || locale === "nl" || locale === "pt-BR") { - // ko, nl and pt-BR ship no safety-contract matrix, so they are not a + } else if ( + locale === "ko" || + locale === "nl" || + locale === "pt-BR" || + locale === "ru" + ) { + // ko, nl, pt-BR and ru ship no safety-contract matrix, so they are not a // NativeCoachLocale. base = COACH_PROMPT_EN + LOCALE_REPLY_FOOTER_FALLBACK[locale]; } else { diff --git a/src/lib/ai/prompts/insight-generator.ts b/src/lib/ai/prompts/insight-generator.ts index 8b372f32e..86888d704 100644 --- a/src/lib/ai/prompts/insight-generator.ts +++ b/src/lib/ai/prompts/insight-generator.ts @@ -994,7 +994,12 @@ export function getStrictInsightsSystemPrompt(locale: Locale): string { if (locale === "en") return SYSTEM_PROMPT_EN; // ko, nl and pt-BR ship no safety-contract matrix, so they are not a // NativeCoachLocale. - if (locale === "ko" || locale === "nl" || locale === "pt-BR") { + if ( + locale === "ko" || + locale === "nl" || + locale === "pt-BR" || + locale === "ru" + ) { return SYSTEM_PROMPT_EN + INSIGHTS_LOCALE_REPLY_FOOTER_FALLBACK[locale]; } try { diff --git a/src/lib/ai/prompts/insights-reply-footers.ts b/src/lib/ai/prompts/insights-reply-footers.ts index ed33b9caa..ea1d90710 100644 --- a/src/lib/ai/prompts/insights-reply-footers.ts +++ b/src/lib/ai/prompts/insights-reply-footers.ts @@ -16,6 +16,7 @@ export const INSIGHTS_LOCALE_REPLY_FOOTER_FALLBACK: Record< pl: "\n\nREPLY LANGUAGE: render all user-facing strings in Polish. Use natural Polish health vocabulary with formal Pan/Pani register for medical-adjacent topics. The severity / sourceWindow / sourceMetric / topic enum values stay in lowercase English exactly as listed in OUTPUT FORMAT — those are contract keys, NOT translations.", nl: "\n\nREPLY LANGUAGE: render all user-facing strings in Dutch, in the informal je/jij register throughout (never formal u). Use natural Dutch health vocabulary. The severity / sourceWindow / sourceMetric / topic enum values stay in lowercase English exactly as listed in OUTPUT FORMAT — those are contract keys, NOT translations.", ko: "\n\nREPLY LANGUAGE: render all user-facing strings in Korean, in the 해요체 register throughout (never 합쇼체 or plain 한다체). Use natural Korean health vocabulary. The severity / sourceWindow / sourceMetric / topic enum values stay in lowercase English exactly as listed in OUTPUT FORMAT — those are contract keys, NOT translations.", + ru: "\n\nREPLY LANGUAGE — THIS OVERRIDES THE LANGUAGE RULE ABOVE. The \"Respond in English\" instruction earlier in this prompt does NOT apply to this request: write EVERY user-facing string in Russian (русский язык), with natural Russian medical vocabulary and the standard Russian lab terminology, addressing the user with «вы». Never answer in English. The severity / sourceWindow / sourceMetric / topic enum values still stay in lowercase English exactly as listed in OUTPUT FORMAT — those are contract keys, NOT translations.", "pt-BR": "\n\nREPLY LANGUAGE: render all user-facing strings in Brazilian Portuguese (pt-BR, never European Portuguese), addressing the user as você throughout. Use natural Brazilian health vocabulary. The severity / sourceWindow / sourceMetric / topic enum values stay in lowercase English exactly as listed in OUTPUT FORMAT — those are contract keys, NOT translations.", }; diff --git a/src/lib/ai/safety/outbound-screen.ts b/src/lib/ai/safety/outbound-screen.ts index ce81c2e74..29a8ecbf2 100644 --- a/src/lib/ai/safety/outbound-screen.ts +++ b/src/lib/ai/safety/outbound-screen.ts @@ -51,6 +51,7 @@ import { bank as pl } from "./outbound-screen/locales/pl"; import { bank as nl } from "./outbound-screen/locales/nl"; import { bank as ko } from "./outbound-screen/locales/ko"; import { bank as ptBR } from "./outbound-screen/locales/pt-br"; +import { bank as ru } from "./outbound-screen/locales/ru"; import { DOSE_UNIT, INN_STEM, @@ -85,6 +86,7 @@ const LOCALE_BANKS: Readonly> = { nl, ko, "pt-BR": ptBR, + ru, }; /** One value per locale, read off its bank. */ diff --git a/src/lib/ai/safety/outbound-screen/locales/ru.ts b/src/lib/ai/safety/outbound-screen/locales/ru.ts new file mode 100644 index 000000000..2e28d4f5f --- /dev/null +++ b/src/lib/ai/safety/outbound-screen/locales/ru.ts @@ -0,0 +1,149 @@ +/** Outbound-screen banks for Russian, composed by `../../outbound-screen.ts`. */ +import { + DOSE_UNIT, + DRUG_UNIT, + UNIT_END, + ENGINE, + medicationExtras, + unlessDeferred, + type LocaleBank, +} from "../shared"; + +const RU_MED_NOUN = + "(?:доз[аыуей]|дозу|таблетк\\w*|капсул\\w*|препарат\\w*|лекарств\\w*|инсулин\\w*|инъекц\\w*|укол\\w*|средств\\w*|терапи\\w*|при[её]м\\w*)"; + +/** Russian dosage-form counters, with the case endings an object takes. */ +const RU_COUNT = "(?:таблетк\\w*|капсул\\w*|капл\\w*|доз\\w*|единиц\\w*|ед\\.?|мл)"; + +const RU_TARGET = `(?:[\\d.,]+(?:\\s*${DRUG_UNIT}${UNIT_END}|\\s*${RU_COUNT})|(?:одну|одна|две|два|три|четыре|половину|полторы|пол)\\s*${RU_COUNT})`; + +/** + * A Russian imperative or recommendation that closes a dose clause. The + * prohibitive forms ("не увеличивайте", "не снижайте") never reach the verb + * from a negation-aware lead, and the talking-about forms ("увеличил") carry a + * different ending. + */ +const RU_IMPERATIVE = + "(?:(?:увеличьте|увеличь|повысьте|повысь|поднимите|подними|нарастите|снизьте|снизь|уменьшите|уменьши|понизьте|понизь|опустите|опусти|сократите|сократи|удвойте|удвой|уполовиньте|разделите|пропустите|пропусти|отмените|отмени|прекратите|прекрати|примите|принимайте|начните|начинайте|перейдите))"; + +// Russian writes "12%" with digits; the spelled-out counters ("двенадцать +// процентов") are rare in model prose and collide with the numeral declension, +// so only the digit forms are matched. +const QUAL_NUM_RU = "(?:\\d{1,3}\\s*(?:%|процент\\w*))"; + +const RISK_NOUN_RU = "(?:риск\\w*|вероятност\\w*|шанс\\w*)"; + +const HORIZON_RU = + "(?:(?:10|десяти)[- ]?летн\\w*|пожизненн\\w*)\\s*(?:риск\\w*|сердечно[- ]сосудист\\w*|смертност\\w*)"; + +const RESULT_VERB_RU = + "(?:относит\\w*|попада\\w*|классифицир\\w*|перевод\\w*|помеща\\w*|оказыва\\w*\\s*в)"; + +const RISK_BAND_RU = + "(?:высок|повышенн|промежуточн|умеренн|низк)\\w*\\s*(?:риск\\w*|категор\\w*|групп\\w*|диапазон\\w*|полос\\w*)"; + +const RISK_LEVEL_RU = "(?:высок|повышен|умеренн|низк|пограничн|тревожн)"; + +const RISK_VERDICT_RU = `(?:[—–-]|это|является|находится|означает)\\s*[^.?!]{0,10}${RISK_LEVEL_RU}`; + +const RU_MED_CLASS = + "(?:антикоагулянт\\w*|антиагрегант\\w*|статины|статин\\w*|бета[- ]блокатор\\w*|диуретик\\w*|антидепрессант\\w*|метформин\\w*|инсулин\\w*)"; + +/** Signals that the number-free change shapes stand down for (`unlessDeferred`). */ +const RU_DEFERRAL = "\\?|врач\\w*|доктор\\w*|специалист\\w*|эндокринолог\\w*|фармацевт\\w*|обсуди\\w*|посовету\\w*|спроси\\w*|если\\s+только|не\\s+"; + +export const bank: LocaleBank = { + vocabulary: (names) => + `(?:${RU_MED_NOUN}|(?:${medicationExtras(RU_MED_CLASS, names, false)})\\S{0,3})`, + doseChangeClass: (med) => [ + // A stated amount closed by an imperative or a recommendation: + // "2000 мг увеличьте", "принимайте 2 таблетки". + new RegExp(`${RU_TARGET}[^.?!]{0,25}${RU_IMPERATIVE}`, "i"), + // A medication object halved, doubled, skipped or stopped by imperative. + new RegExp( + `${med}[^.?!]{0,20}(?:(?:вдвое|в\\s*два\\s*раза|пополам|вдвое\\s+меньше|наполовину)\\s*(?:увеличьте|увеличь|снизьте|снизь|уменьшите|уменьши|сократите|разделите|удвойте)|(?:пропустите|пропусти|пропускать|отмените|отмени|прекратите|прекрати|бросьте))`, + ), + new RegExp( + `(?:доз[уа]|при[её]м|инъекци\\w*|укол\\w*)\\s*(?:пропустите|пропусти|пропускать|отмените|отмени|прекратите|прекрати)`, + ), + // One more dose of a medication, closed by an imperative: + // "примите ещё одну таблетку метформина". + new RegExp( + `${med}[^.?!]{0,12}(?:ещ[её]|дополнительн\\w*|лишн\\w*)\\s*(?:одну|одна|две|дозу|таблетку|капсулу)?\\s*(?:примите|принимайте|выпейте|прими)`, + ), + // A medication object raised or lowered by imperative with no amount, + // standing down where a question, a negation or a clinician appears. + unlessDeferred( + RU_DEFERRAL, + new RegExp( + `${med}[^.?!\\d]{0,8}?(?:увеличьте|увеличь|повысьте|повысь|поднимите|подними|снизьте|снизь|уменьшите|уменьши|понизьте|понизь|опустите|опусти|сократите|сократи)`, + ), + ), + ], + // A target dose: the unit sits on the number and a change verb or a + // recommending lead-in frames it. The permitted restatement ("вы на 7,5 мг + // на этой неделе") names no change verb and does not trip. + dose: [ + new RegExp( + `[\\d.,]+\\s*${DOSE_UNIT}\\s*(?:до|вплоть\\s*до)[^.?!]{0,20}(?:увелич|повыс|подним|нараст|начинай|переход|сниз|уменьш|пониз|опуст|сократ)`, + "i", + ), + new RegExp( + `(?:увелич|повыс|подним|нараст|сниз|уменьш|пониз|опуст|сократ)\\w*[^.?!]{0,40}[\\d.,]+\\s*${DOSE_UNIT}${UNIT_END}`, + "i", + ), + new RegExp( + `(?:рекоменд|совету|предлаг|стоит|нужно|следует|можно)[^.?!]{0,40}[\\d.,]+\\s*${DOSE_UNIT}${UNIT_END}`, + "i", + ), + new RegExp( + `[\\d.,]+\\s*${DOSE_UNIT}${UNIT_END}[^.?!]{0,40}(?:рекоменд|совету|предлаг|стоит|принимайте|примите|начните|перейдите)`, + "i", + ), + new RegExp( + `(?:следующ|нов|целев|рабоч)\\w*\\s*(?:доз|этап|титрац)\\w*[^.?!]{0,30}[\\d.,]+\\s*${DOSE_UNIT}${UNIT_END}`, + "i", + ), + unlessDeferred( + RU_DEFERRAL, + /(?:доз|таблетк|капсул|инсулин|препарат|лекарств|приём|прием)[^.?!]{0,25}(?:вдвое|в два раза|пополам|пропуст|отмен|прекрат|удво|уполовин)[^.?!]{0,40}(?:недел|дн|месяц|попробуйте|можно)/, + ), + ], + risk: [ + new RegExp(`${RISK_NOUN_RU}[^.?!]{0,15}${QUAL_NUM_RU}`, "i"), + new RegExp(`${QUAL_NUM_RU}[^.?!]{0,15}${RISK_NOUN_RU}`, "i"), + new RegExp(`${HORIZON_RU}[^.?!]{0,40}${QUAL_NUM_RU}`, "i"), + new RegExp(`${QUAL_NUM_RU}[^.?!]{0,40}${HORIZON_RU}`, "i"), + new RegExp(`\\b${ENGINE}\\b[^.?!]{0,50}${QUAL_NUM_RU}`, "i"), + new RegExp(`${QUAL_NUM_RU}[^.?!]{0,50}\\b${ENGINE}\\b`, "i"), + new RegExp( + `(?:\\b${ENGINE}\\b|${HORIZON_RU})[^.?!]{0,60}${RESULT_VERB_RU}`, + "i", + ), + new RegExp( + `(?:\\b${ENGINE}\\b|${HORIZON_RU})[^.?!]{0,60}${RISK_BAND_RU}`, + "i", + ), + new RegExp( + `(?:\\b${ENGINE}\\b|${HORIZON_RU})[^.?!]{0,40}${RISK_VERDICT_RU}`, + "i", + ), + ], + causal: [ + /потому\s+что/i, + /из[- ]за/i, + /причин\w*/i, + /вызван\w*/i, + /приводит\s+к/i, + /привел[оаи]\s+к/i, + /вследствие/i, + /обусловлен\w*/i, + /следстви\w*/i, + /благодаря/i, + /явля\w+\s+(?:причиной|результатом)/i, + ], + continuation: + /(?:продолжайте|продолжайте\s+принимать|продолжить\s+при[её]м|как\s+назначено|по\s+назначению|как\s+обычно|как\s+и\s+раньше|в\s+той\s+же\s+дозе|не\s+меняйте)/i, + changeStem: + /(?:увелич|повыс|подним|нараст|сниз|уменьш|пониз|опуст|сократ|удво|уполовин|пропуст|отмен|прекрат|перейд|начнит|измен|титр)/i, +}; diff --git a/src/lib/format-locale.ts b/src/lib/format-locale.ts index 91530af61..c40fb4f86 100644 --- a/src/lib/format-locale.ts +++ b/src/lib/format-locale.ts @@ -33,6 +33,7 @@ const INTL_LOCALE_MAP: Record = { ko: "ko-KR", nl: "nl-NL", "pt-BR": "pt-BR", + ru: "ru-RU", }; export function resolveIntlLocale(locale: Locale): string { diff --git a/src/lib/i18n/config.ts b/src/lib/i18n/config.ts index b830d4aa6..166463fe8 100644 --- a/src/lib/i18n/config.ts +++ b/src/lib/i18n/config.ts @@ -8,6 +8,7 @@ export const locales = [ "ko", "nl", "pt-BR", + "ru", ] as const; export type Locale = (typeof locales)[number]; @@ -68,6 +69,7 @@ export const localeLanguageNames: Record = { ko: "Korean", nl: "Dutch", "pt-BR": "Brazilian Portuguese", + ru: "Russian", }; export const localeLabels: Record = { @@ -80,6 +82,7 @@ export const localeLabels: Record = { ko: "한국어", nl: "Nederlands", "pt-BR": "Português (Brasil)", + ru: "Русский", }; /** diff --git a/src/lib/i18n/load-locale.ts b/src/lib/i18n/load-locale.ts index 17dce7f89..c79aeedf4 100644 --- a/src/lib/i18n/load-locale.ts +++ b/src/lib/i18n/load-locale.ts @@ -56,6 +56,7 @@ const loaders: Record Promise<{ default: MessageBundle }>> = { ko: () => import("../../../messages/ko.json"), nl: () => import("../../../messages/nl.json"), "pt-BR": () => import("../../../messages/pt-BR.json"), + ru: () => import("../../../messages/ru.json"), }; function initialCache(): Partial> { diff --git a/src/lib/labs/parse-reference-range.ts b/src/lib/labs/parse-reference-range.ts index 9fa24fc72..59dafbbdb 100644 --- a/src/lib/labs/parse-reference-range.ts +++ b/src/lib/labs/parse-reference-range.ts @@ -323,6 +323,45 @@ export const RANGE_PROSE: Record = { lower: ["최소", "최저"], filler: ["참고치", "참고범위", "정상치", "정상범위", "기준치", "기준범위"], }, + // Russian lab sheets print "3,5 - 5,0", "от 3,5 до 5,0", "до 5,6", + // "не более 5,6", "не менее 3,5" — "от"/"до" are both a bound prefix and a + // filler, which is why they appear in all three lists. + ru: { + twoSided: ["до", "по"], + upper: [ + "до", + "не более", + "не выше", + "менее", + "меньше", + "ниже", + "макс.", + "макс", + "максимум", + ], + lower: [ + "от", + "не менее", + "не ниже", + "более", + "больше", + "выше", + "мин.", + "мин", + "минимум", + ], + filler: [ + "от", + "до", + "референс", + "референсные значения", + "референсный интервал", + "норма", + "показатели нормы", + "реф.", + "реф", + ], + }, }; /** Escape a literal for regex use and let any run of whitespace join its words. */ diff --git a/src/lib/mental-health/wording/gad7/ru.ts b/src/lib/mental-health/wording/gad7/ru.ts new file mode 100644 index 000000000..a7b0a94a3 --- /dev/null +++ b/src/lib/mental-health/wording/gad7/ru.ts @@ -0,0 +1,35 @@ +/** + * GAD-7, Russian: a working translation written for HealthLog (not a + * published validated one), faithful to the English original and on the same + * 0-3 scale. + * + * Источник: Рабочий перевод HealthLog с английского оригинала GAD-7 (Spitzer, Kroenke, Williams & Löwe, Arch Intern Med 2006;166:1092-1097). Валидированный русскоязычный вариант в открытом доступе отсутствует. + */ +import type { InstrumentWording } from "../types"; + +const wording: InstrumentWording = { + validated: false, + stems: { + period: + "За последние 2 недели как часто вас беспокоили следующие проблемы?", + }, + items: [ + "Вы чувствовали нервозность, тревогу или напряжённость", + "Вам не удавалось остановить или сдержать беспокойство", + "Вы слишком много беспокоились о разных вещах", + "Вам было трудно расслабиться", + "Вы были настолько беспокойны, что трудно было усидеть на месте", + "Вы легко раздражались", + "Вы боялись, что может случиться что-то ужасное", + ], + anchors: { + all: { + 0: "Совсем нет", + 1: "Несколько дней", + 2: "Больше половины дней", + 3: "Почти каждый день", + }, + }, +}; + +export default wording; diff --git a/src/lib/mental-health/wording/index.ts b/src/lib/mental-health/wording/index.ts index 3552e07bd..dd6ef3d1e 100644 --- a/src/lib/mental-health/wording/index.ts +++ b/src/lib/mental-health/wording/index.ts @@ -35,6 +35,7 @@ import phq9Pl from "./phq9/pl"; import phq9Ko from "./phq9/ko"; import phq9Nl from "./phq9/nl"; import phq9PtBr from "./phq9/pt-br"; +import phq9Ru from "./phq9/ru"; import gad7En from "./gad7/en"; import gad7De from "./gad7/de"; import gad7Es from "./gad7/es"; @@ -44,6 +45,7 @@ import gad7Pl from "./gad7/pl"; import gad7Ko from "./gad7/ko"; import gad7Nl from "./gad7/nl"; import gad7PtBr from "./gad7/pt-br"; +import gad7Ru from "./gad7/ru"; import who5En from "./who5/en"; import who5De from "./who5/de"; import who5Es from "./who5/es"; @@ -53,6 +55,7 @@ import who5Pl from "./who5/pl"; import who5Ko from "./who5/ko"; import who5Nl from "./who5/nl"; import who5PtBr from "./who5/pt-br"; +import who5Ru from "./who5/ru"; import sciEn from "./sci/en"; import sciDe from "./sci/de"; import sciEs from "./sci/es"; @@ -62,6 +65,7 @@ import sciPl from "./sci/pl"; import sciKo from "./sci/ko"; import sciNl from "./sci/nl"; import sciPtBr from "./sci/pt-br"; +import sciRu from "./sci/ru"; export const WORDING: Readonly< Record>> @@ -76,6 +80,7 @@ export const WORDING: Readonly< ko: phq9Ko, nl: phq9Nl, "pt-BR": phq9PtBr, + ru: phq9Ru, }, GAD7: { en: gad7En, @@ -87,6 +92,7 @@ export const WORDING: Readonly< ko: gad7Ko, nl: gad7Nl, "pt-BR": gad7PtBr, + ru: gad7Ru, }, WHO5: { en: who5En, @@ -98,6 +104,7 @@ export const WORDING: Readonly< ko: who5Ko, nl: who5Nl, "pt-BR": who5PtBr, + ru: who5Ru, }, SCI: { en: sciEn, @@ -109,5 +116,6 @@ export const WORDING: Readonly< ko: sciKo, nl: sciNl, "pt-BR": sciPtBr, + ru: sciRu, }, }; diff --git a/src/lib/mental-health/wording/load.ts b/src/lib/mental-health/wording/load.ts index 308b3d12b..3c7d324da 100644 --- a/src/lib/mental-health/wording/load.ts +++ b/src/lib/mental-health/wording/load.ts @@ -18,6 +18,7 @@ const LOADERS: Record Promise<{ default: LocaleWording }>> = { ko: () => import("./locales/ko"), nl: () => import("./locales/nl"), "pt-BR": () => import("./locales/pt-br"), + ru: () => import("./locales/ru"), }; export async function loadLocaleWording( diff --git a/src/lib/mental-health/wording/locales/ru.ts b/src/lib/mental-health/wording/locales/ru.ts new file mode 100644 index 000000000..97f89d877 --- /dev/null +++ b/src/lib/mental-health/wording/locales/ru.ts @@ -0,0 +1,10 @@ +import gad7 from "../gad7/ru"; +import phq9 from "../phq9/ru"; +import sci from "../sci/ru"; +import who5 from "../who5/ru"; +import type { LocaleWording } from "../types"; + +/** Every questionnaire in Russian, loaded as one chunk. */ +const wording: LocaleWording = { PHQ9: phq9, GAD7: gad7, WHO5: who5, SCI: sci }; + +export default wording; diff --git a/src/lib/mental-health/wording/phq9/ru.ts b/src/lib/mental-health/wording/phq9/ru.ts new file mode 100644 index 000000000..889d824c2 --- /dev/null +++ b/src/lib/mental-health/wording/phq9/ru.ts @@ -0,0 +1,47 @@ +/** + * PHQ-9, Russian: a working translation written for HealthLog (not a + * published validated one), faithful to the English original and on the same + * 0-3 scale, so scores stay comparable across languages. + * + * Источник: Рабочий перевод HealthLog с английского оригинала PHQ-9 (Kroenke, Spitzer & Williams, J Gen Intern Med 2001;16:606-613). Валидированный русскоязычный вариант в открытом доступе отсутствует. + */ +import type { InstrumentWording } from "../types"; + +const wording: InstrumentWording = { + validated: false, + stems: { + period: + "За последние 2 недели как часто вас беспокоили следующие проблемы?", + }, + items: [ + "Вам было неинтересно или не приносило удовольствия то, что вы делали", + "Вы чувствовали подавленность, угнетённость или безысходность", + "Вам было трудно заснуть, вы плохо спали или спали слишком много", + "Вы чувствовали усталость или упадок сил", + "У вас был плохой аппетит или вы переедали", + "Вы плохо думали о себе, считали себя неудачником или подводили себя и свою семью", + "Вам было трудно сосредоточиться, например читать или смотреть телевизор", + "Вы двигались или говорили заметно медленнее обычного — или, наоборот, были настолько суетливы и беспокойны, что двигались больше обычного", + "Вам приходили мысли, что вам лучше умереть, или о том, чтобы причинить себе вред", + ], + anchors: { + all: { + 0: "Совсем нет", + 1: "Несколько дней", + 2: "Больше половины дней", + 3: "Почти каждый день", + }, + }, + functional: { + title: + "Если вы отметили какие-либо проблемы, насколько они затрудняли вам работу, домашние дела или общение с другими людьми?", + anchors: { + 0: "Совсем не затрудняли", + 1: "Несколько затрудняли", + 2: "Сильно затрудняли", + 3: "Очень сильно затрудняли", + }, + }, +}; + +export default wording; diff --git a/src/lib/mental-health/wording/sci/ru.ts b/src/lib/mental-health/wording/sci/ru.ts new file mode 100644 index 000000000..6e79b9c65 --- /dev/null +++ b/src/lib/mental-health/wording/sci/ru.ts @@ -0,0 +1,59 @@ +/** + * SCI, Russian: a working translation written for HealthLog (not a published + * validated one), faithful to the eight items and their anchor sets. + * + * Источник: Рабочий перевод HealthLog с английского оригинала SCI (Espie CA, Kyle SD, Hames P, et al. The Sleep Condition Indicator. BMJ Open 2014;4:e004183). + */ +import type { InstrumentWording } from "../types"; + +const wording: InstrumentWording = { + validated: false, + stems: { + night: "Думая об обычной ночи за последний месяц…", + impact: "Думая о прошедшем месяце, в какой степени плохой сон…", + finally: "И последнее…", + }, + items: [ + "… сколько времени вам нужно, чтобы заснуть?", + "… если вы просыпаетесь ночью, сколько времени вы бодрствуете в сумме? (сложите все пробуждения)", + "… сколько ночей в неделю у вас есть проблема со сном?", + "… как бы вы оценили качество своего сна?", + "… влиял на ваше настроение, энергию или отношения?", + "… влиял на вашу концентрацию, продуктивность или способность бодрствовать?", + "… беспокоил вас в целом?", + "… как давно у вас есть проблема со сном?", + ], + anchors: { + duration: { + 0: "≥ 61 мин", + 1: "46–60 мин", + 2: "31–45 мин", + 3: "16–30 мин", + 4: "0–15 мин", + }, + nights: { 0: "5–7", 1: "4", 2: "3", 3: "2", 4: "0–1" }, + quality: { + 0: "Очень плохое", + 1: "Плохое", + 2: "Среднее", + 3: "Хорошее", + 4: "Очень хорошее", + }, + impact: { + 0: "Очень сильно", + 1: "Сильно", + 2: "Умеренно", + 3: "Немного", + 4: "Совсем нет", + }, + problemDuration: { + 0: "> 1 года", + 1: "7–12 месяцев", + 2: "3–6 месяцев", + 3: "1–2 месяца", + 4: "Проблемы нет / < 1 месяца", + }, + }, +}; + +export default wording; diff --git a/src/lib/mental-health/wording/who5/ru.ts b/src/lib/mental-health/wording/who5/ru.ts new file mode 100644 index 000000000..3bb5521d6 --- /dev/null +++ b/src/lib/mental-health/wording/who5/ru.ts @@ -0,0 +1,32 @@ +/** + * WHO-5, Russian: a working translation written for HealthLog (the WHO's own + * Russian version is under CC BY-NC-SA and not reproduced verbatim here), + * faithful to the five items and the 0-5 scale. + * + * Источник: Рабочий перевод HealthLog опросника ВОЗ-5 (World Health Organization. The World Health Organization-Five Well-Being Index (WHO-5). Geneva: WHO; 2024, WHO/UCN/MSD/MHE/2024.1). + */ +import type { InstrumentWording } from "../types"; + +const wording: InstrumentWording = { + validated: false, + stems: { period: "За последние две недели…" }, + items: [ + "Я чувствовал себя бодрым и в хорошем настроении", + "Я чувствовал себя спокойно и расслабленно", + "Я чувствовал себя активным и полным сил", + "Я просыпался свежим и отдохнувшим", + "Моя повседневная жизнь была наполнена тем, что мне интересно", + ], + anchors: { + all: { + 0: "Ни разу", + 1: "Иногда", + 2: "Меньше половины времени", + 3: "Больше половины времени", + 4: "Большую часть времени", + 5: "Всё время", + }, + }, +}; + +export default wording; diff --git a/src/lib/telegram-bare-words.ts b/src/lib/telegram-bare-words.ts index 567df26b0..7be89e3c6 100644 --- a/src/lib/telegram-bare-words.ts +++ b/src/lib/telegram-bare-words.ts @@ -34,6 +34,10 @@ const BARE_WORDS: Readonly> = { ko: { help: ["도움말", "도움"], greeting: ["안녕", "안녕하세요"] }, nl: { help: ["hulp"], greeting: ["hoi", "hallo", "goedemorgen"] }, "pt-BR": { help: ["ajuda"], greeting: ["oi", "ola", "bom dia"] }, + ru: { + help: ["помощь", "помоги", "помогите"], + greeting: ["привет", "здравствуй", "здравствуйте", "добрый день"], + }, }; /** "Help", in every language the app ships. */