Files
PTSRaiAgent/web/src/content/ru.ts
T
Arxip222andClaude Opus 5.5 290b0d6151 feat(web): two-stage questionnaires, screening result and diary by result
- Sign-in: centred ЕМИАС card without the sidebar; anonymous entry asks «Депрессия / ПТСР».
- Stage 1 is the same for everyone and follows the fixed order of the MVP questionnaire:
  PHQ-2 → trauma filter/TSQ → RUS-AUDIT-S → C-SSRS → context; stage 2 only where stage 1
  is positive. Starts without a profile.
- After stage 1 the patient sees a preliminary result (screening, not a diagnosis), stored
  with the record; it switches on the diary modules (depression / PTSD).
- Stage 2 diary: morning (sleep, sleep quality, alcohol) and evening (mood, medication,
  3 PHQ-9 items in rotation, short PCL-5); C-SSRS since last contact only under risk;
  flags on weekly means against the personal norm; scheduled full scales with change
  (remission, response, worsening).
- Questionnaire log: GET /me/{token}/results and the «Мои результаты» screen.
- Questionnaires centred without the sidebar and without scale names; «Продолжить позже»
  goes home; confirmations are toasts; free-text comments are optional.
- Demo policy config/questionnaire_demo.yaml (INTAKE_DEMO only, not a clinical approval).

ADR-012.

Refs #77

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 15:14:09 +03:00

253 lines
15 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* All interface texts of the patient app (copy from docs/mock). Dialog content — consent, questions, scales,
* reminders — comes from the engine (config/texts/) and is NOT duplicated here.
*/
export const ru = {
product: {
name: "Сопровождение пациента",
tagline: "между визитами к врачу",
},
nav: {
today: "Сегодня",
meds: "Лекарства",
doctor: "Врач",
profile: "Профиль",
messages: "Сообщения",
signIn: "Вход",
help: "Помощь",
},
help: {
block: "Экстренная помощь",
title: "Экстренная помощь",
lead: "Если вам нужна срочная помощь, позвоните сразу.",
call: "Позвонить",
close: "Закрыть",
alwaysNote: "Вы не одни. Помощь доступна круглосуточно.",
fallbackName: "Единый номер экстренных служб",
fallbackNote: "",
},
common: {
back: "Назад",
next: "Далее",
skip: "Пропустить",
send: "Отправить",
retry: "Повторить",
toToday: "Вернуться на сегодня",
recommended: "Рекомендуем",
networkError: "Не удалось подключиться к сервису. Проверьте интернет и повторите.",
},
welcome: {
title: "Вход",
emias: {
title: "Войти через ЕМИАС",
perks: [
"Назначения врача подгружаются автоматически",
"Врач видит ответы и получает сигнал при ухудшении",
"История доступна с любого устройства",
],
},
or: "или",
anonymous: {
title: "Войти анонимно",
text: "Без имени и полиса. Врач не видит ответы, история хранится только на этом устройстве.",
},
disclaimer: "Сервис не ставит диагнозы и не назначает лечение — решения принимает врач.",
},
emias: {
title: "Введите код от врача",
lead: "Это одноразовый код. Он нужен, чтобы безопасно подключить ваши назначения и план наблюдения.",
demoNotice: "Демонстрационный режим: авторизация в ЕМИАС не выполняется, вход подтверждается кодом от врача.",
codeLabel: "Код подключения",
codePlaceholder: "Код из памятки",
submit: "Продолжить",
submitting: "Проверяем код…",
codeError: "Код не подошёл — проверьте написание или попросите врача выдать новый.",
or: "или",
demoTitle: "Демо-пациенты",
demoLead: "Нет кода? Войдите под синтетической учётной записью.",
demoDay: (day: number) => `${day}-й день терапии`,
},
anonymous: {
title: "Что вы хотите проверить?",
note: "Анонимно: врач не видит ответы, история хранится только на этом устройстве.",
focus: {
depression: { title: "Депрессия", text: "Подавленность, потеря интереса, усталость" },
ptsd: { title: "ПТСР", text: "Последствия травмы: флешбэки, кошмары, тревога" },
},
submitting: "Создаём профиль…",
},
today: {
title: "Сегодня",
takeMed: "Принять лекарство",
now: "Сейчас",
checkin: "Отметка самочувствия",
checkinHint: "меньше минуты",
done: "Уже выполнено",
medTaken: "Лекарство",
medTakenAt: (time: string) => `принято, ${time}`,
checkinDone: "Самочувствие отмечено",
allDoneTitle: "На сегодня всё сделано",
allDoneNext: (time: string) => `Следующее напоминание о лекарстве — ${time}`,
allDoneNoMeds: "Следующая отметка самочувствия — завтра",
viewMeds: "Посмотреть лекарства",
visit: "Следующий визит к врачу",
medQuestion: "Вопрос о лекарстве",
medQuestionHint: "Ответ по официальной инструкции",
messageDoctor: "Сообщение врачу",
messageDoctorHint: "Врач ответит в рабочее время",
week: "Приём на этой неделе",
weekTaken: (taken: number, total: number) => (total ? `Принято ${taken} из ${total}` : "Отметок пока нет"),
noDoctor: "Врач не подключён. Подключите ЕМИАС в профиле, чтобы назначения и визиты появились здесь.",
newMessage: "Новое сообщение",
open: "Открыть",
continue: "Продолжить",
intakeStart: "Первичный опрос",
intakeStartHint: "15–20 минут, можно прерваться и продолжить позже",
intakeResume: "Продолжить первичный опрос",
intakeResumeHint: "Ответы сохранены, можно продолжить",
intakeReview:
"Опрос приостановлен: продолжить можно после оценки специалиста, врач уже получил уведомление. Если нужна помощь сейчас — 112.",
intakeDone: "Первичный опрос пройден",
diary: "Дневник самочувствия",
diaryHint: "2–3 минуты: настроение, сон, лекарства",
diaryPart: { morning: "Дневник — утро", evening: "Дневник — вечер" },
diaryPartHint: { morning: "3 вопроса: сон и алкоголь", evening: "Настроение, лекарства и модули по результату опроса" },
results: "Мой результат",
diaryDone: "Дневник заполнен",
therapyDay: (day: number) => `День ${day} лечения`,
effectHint: "Когда ждать эффекта и что важно знать",
},
meds: {
title: "Моя схема приёма",
lead: "По назначению врача. Отмечайте приём препаратов, чтобы не пропускать.",
byDoctor: "По назначению врача",
tablet: "1 приём",
week: ["Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"],
onlyDoctor: "Схему меняет только врач. Не изменяйте дозировку самостоятельно.",
empty: "Назначения появятся здесь после входа через ЕМИАС.",
question: "Вопрос о лекарстве",
reminderTitle: "Время принять препарат",
reminderLead: "По назначению врача",
taken: "Принял(а)",
skip: "Пропущу",
sideEffects: "Есть побочные эффекты",
about: "О препарате",
reportSideEffect: "Сообщить о побочном эффекте",
therapyDay: (day: number) => `День лечения: ${day}`,
card: {
back: "К схеме приёма",
prescribed: "Назначено",
effect: "Когда ждать эффекта",
effectAt: (when: string) => `Эффект оценивают через ${when}`,
progress: (day: number) => `Вы принимаете препарат ${day} ${day % 10 === 1 && day % 100 !== 11 ? "день" : [2, 3, 4].includes(day % 10) && ![12, 13, 14].includes(day % 100) ? "дня" : "дней"}`,
course: "Сколько принимать",
courseShort: (days: number) => `Обычно не дольше ${Math.round(days / 7)} недель — срок определяет врач`,
sideEffects: "Что может беспокоить",
sideEffectsHint:
"Побочные эффекты часто ослабевают в первые недели. Если они мешают жить, сообщите врачу — он может изменить дозу или подобрать другой препарат. Не меняйте схему сами.",
sideEffectsNone: "Частые побочные эффекты в клинических рекомендациях не описаны — спросите врача.",
redFlags: "Когда срочно к врачу",
important: "Важно",
withdrawal: "Резкая отмена этого препарата может вызвать неприятные ощущения: головокружение, раздражительность, нарушения сна. Отменяют его постепенно и только с врачом.",
overdose: "Храните препарат в недоступном для других месте и принимайте строго в назначенной дозе.",
monitoring: "Врач может назначить обследования",
instruction: "Как принимать, что делать при пропуске, алкоголь и вождение",
ask: "Задать вопрос о лекарстве",
source: (sources: string) => `Источник: ${sources}. Черновик справочника, проверяется врачом-психиатром.`,
offLabel: "Назначение вне зарегистрированных показаний — так бывает, решение принимает врач.",
unknown: "Справки по этому препарату пока нет. Уточните у врача или в инструкции к препарату.",
},
},
doctor: {
title: "Врач",
visit: "Следующий визит",
visitNone: "Дата следующего визита пока не назначена",
attending: "Ваш лечащий врач",
write: "Написать врачу",
writeNote: "Обычно врач отвечает в рабочее время. Если срочно — 112.",
earlier: "Записаться к врачу раньше",
plan: "Мой план безопасности",
noDoctor: "Врач не подключён. Подключите ЕМИАС в профиле, чтобы связаться с лечащим врачом.",
},
profile: {
title: "Профиль",
signInMode: "Способ входа",
emias: "ЕМИАС",
anonymous: "Анонимно",
connectEmias: "Подключить ЕМИАС",
data: "Мои данные",
revoke: "Отозвать согласие",
revokeTitle: "Отозвать согласие?",
revokeText: "Ваши ответы больше не будут обрабатываться в приложении.",
revokeConfirm: "Да, отозвать",
cancel: "Отмена",
wipe: "Удалить данные с устройства",
wipeNote: "Для анонимного режима: история на этом устройстве будет удалена.",
logout: "Выйти",
messages: "Сообщения",
result: "Предварительный результат",
resultNone: "Появится после первичного опроса.",
history: "История опросов",
historySub: "Все опросы и дневники с датами и результатами",
},
results: {
title: "Мои результаты",
conclusion: "Предварительный результат",
conclusionDay: (d: string) => `Первичный опрос от ${d}`,
modules: { depression: "Модуль «Депрессия»", veteran: "Модуль «ПТСР»" },
history: "История опросов",
empty: "Здесь появятся пройденные опросы.",
noResult: "Пройдите первичный опрос — после него здесь будет результат.",
toIntake: "Пройти первичный опрос",
},
flow: {
question: (n: number, total: number) => `Вопрос ${n} из ${total}`,
period: "За последний месяц",
textPlaceholder: "Напишите несколько слов",
sending: "Отправляем…",
doneTitle: "Готово",
resultTitle: "Результат",
sendEmpty: "Отправить без комментария",
doneLead: "Врач увидит отметку.",
breathe: "Вдох на 4 — выдох на 6",
breatheIn: "Вдох",
breatheOut: "Выдох",
openPlan: "Открыть мой план безопасности",
supportTitle: "Вы не одни",
exit: "К главной",
planTitle: "Мой план безопасности",
consentTitle: "Согласие на обработку данных о здоровье",
sections: {
safety: "Безопасность",
mood: "Настроение",
trauma: "Пережитый опыт",
alcohol: "Алкоголь",
about: "О вас",
diary: "Дневник",
scale: "Опросник",
},
questionN: (n: number) => `Вопрос ${n}`,
recall: (period: string) => `Период: ${period}`,
hoursLabel: "Сколько часов",
hoursUnit: "ч",
hoursHint: "От 0 до 24, можно с половиной: 6,5",
portionsLabel: "Сколько порций",
portionsUnit: "порц.",
portionsHint: "Если не пили — 0. Можно дробное: 1,5",
drinks: "Таблица стандартных порций",
drinksLead: "Посчитайте, сколько порций выходит в обычный день, когда вы выпиваете.",
noticeTitle: "Опрос приостановлен",
},
messages: {
title: "Сообщения",
inputLabel: "Сообщение",
inputPlaceholder: "Напишите сообщение",
you: "Вы",
empty: "Здесь будут сообщения помощника.",
},
footer: {
law: "Обработка данных о здоровье — только с вашего согласия (152‑ФЗ).",
prototype: "Прототип для хакатона MedITron. Используются только синтетические данные.",
},
} as const;