// src/welcome/copy.ts — single source-of-truth for welcome-page // NON-TAGLINE copy. // // Plan 01-12 (landed first; SUMMARY 2026-05-20) migrated the two D-08 // tagline strings (welcomeHeroRu + welcomeHeroEn) to // _locales/{en,ru}/messages.json. Those keys are read via // chrome.i18n.getMessage in welcome.ts and intentionally NOT included // in this map. // // The remaining keys are engineering-grade placeholders authored in // Russian per D-03 Sober voice register; a future copy-iteration plan // may migrate them to _locales/ for full operator-locale awareness. // // D-08 tagline reference (lives in _locales/, not here): // en/welcomeHeroEn → "Thirty seconds ago, always at hand." // ru/welcomeHeroRu → "Тридцать секунд назад, всегда под рукой." // // References: // - D-02 (welcome layout — Hero + Loom dial), brand-decisions-v1.md // - D-03 (Sober voice register), brand-decisions-v1.md // - D-08 (tagline), brand-decisions-v1.md // - D-16-toolbar (toolbar owns start path), 01-09-SUMMARY.md // - Plan 01-12 Wave 4 chrome.i18n fallback pattern (popup precedent) /** * Plan 01-12 fallback-pattern constants for the welcomeHero keys. * * welcome.ts uses these as the `|| ` fallback when * chrome.i18n.getMessage returns empty string (Plan 01-10 RESEARCH * Pitfall 4 mitigation: chrome.i18n.getMessage returns '' for unknown * keys instead of throwing). * * Exported separately from COPY so the i18n populate path imports them * by name (clean import surface — COPY map stays free of tagline keys). */ export const WELCOME_HERO_RU_FALLBACK = 'Тридцать секунд назад, всегда под рукой.'; export const WELCOME_HERO_EN_FALLBACK = 'Thirty seconds ago, always at hand.'; /** * Non-tagline welcome-page copy. Keys are stable identifiers used by * `[data-mokosh-key='']` attribute selectors in welcome.html; * populateCopy() in welcome.ts walks every element with the attribute * and writes textContent (or document.title for the element). * * Russian phrasing per D-03 Sober voice — restrained, declarative, * no marketing inflection. */ export const COPY: Readonly<Record<string, string>> = Object.freeze({ 'welcome.page.title': 'Добро пожаловать в Mokosh', 'welcome.hero.title': 'Mokosh', // Plan 01-10 must_have #9 path-A swap-in (landed 2026-05-20): // alt text for the canonical mark <img> populated by welcome.ts // populateMark(). The mark is decoratively presented (aria-hidden // is set on the img), so this alt is primarily for screen-reader // landmark identification when aria-hidden is overridden by future // accessibility work. Russian phrasing per D-03 Sober voice. 'welcome.hero.mark.alt': 'Знак Mokosh', 'welcome.body.explainer.line1': 'Mokosh непрерывно записывает последние 30 секунд экрана и 10 минут ' + 'логов вашего браузера.', 'welcome.body.explainer.line2': 'Когда возникает баг, вы одним кликом сохраняете архив для службы ' + 'поддержки. Данные не отправляются никуда — только локально.', // Plan 01-12 D-07 brand-polish (2026-05-20, debug session // 01-12-stale-ai-call-recorder-references): operator sees the toolbar // tooltip "Mokosh — щёлкните, чтобы начать запись" (i18n key // `tooltipOff` in `_locales/ru/messages.json`); welcome CTA must // reference that same brand. Pre-D-07 this line read "иконку AI Call // Recorder" — propagation was missed during the Wave-3 manifest+locales // migration and corrected here. 'welcome.body.cta.toolbar': 'Чтобы начать запись, нажмите иконку Mokosh на панели ' + 'инструментов браузера (правый верхний угол).', 'welcome.footer.privacy': 'Mokosh не отправляет данные на серверы. Архив создаётся ' + 'локально по вашему запросу и остаётся на вашем компьютере.', });