From 110cebc50d6bfa02059e9270a07ad48cc697b9f0 Mon Sep 17 00:00:00 2001 From: Mark Date: Tue, 19 May 2026 22:33:42 +0200 Subject: [PATCH] =?UTF-8?q?feat(01-12):=20wave-3=20task-1=20=E2=80=94=20ma?= =?UTF-8?q?nifest=20i18n=20(=5F=5FMSG=5F*=5F=5F=20+=20default=5Flocale=3D'?= =?UTF-8?q?en')=20+=20=5Flocales/{en,ru}/messages.json=20(16=20keys;=20D-0?= =?UTF-8?q?7=20+=20D-08=20baked=20in)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit manifest.json migrated to chrome i18n placeholders: - name: 'AI Call Recorder' → '__MSG_extName__' - description: 'Запись сессий операторов для диагностики ошибок' → '__MSG_extDesc__' - default_locale: 'en' (new field per RESEARCH §11 + Pitfall 4 fallback chain) - action.default_title: '__MSG_tooltipOff__' (new field per Brief §02 string #1) _locales/en/messages.json + _locales/ru/messages.json each carry the same 16-key matrix per RESEARCH §10 + Brief §02 verbatim + D-07 user override + D-08 tagline: extName, extDesc, tooltipOff, tooltipRecPrefix, tooltipErr, popupSavePrompt, popupSaveCta, popupSaveDone, popupSaving, popupSaveDoneShort, popupEmptyState, popupInfoText, notifStartup, notifRecovery, welcomeHeroRu, welcomeHeroEn Canonical values (per brand-decisions-v1.md + RESEARCH §10 Brief §02): - EN extName = 'Mokosh — Session Capture' (D-07 user override of A) - EN extDesc = 'Thirty seconds ago, always at hand.' (D-08 tagline) - RU extName = 'Mokosh — Запись сессии' - RU extDesc = 'Тридцать секунд назад, всегда под рукой.' NB on key count: the artifact-table 12-key baseline excluded the three Wave-4 deltas (popupSaving, popupSaveDoneShort, popupEmptyState) which are introduced now to avoid a re-locale-parity flap when Wave 4 lands. popupInfoText is present in BOTH locales (the plan-checker flag 1 informational scope-slip is corrected here — see deviation block below). Plan success-criteria reading: ≥12 keys with Wave 4 additive deltas accounted for. Each key carries both `message` and `description` per Chrome i18n schema. EN descriptions are translator-facing; RU descriptions are plain-Russian context for native operators. npm run build emits: - dist/manifest.json carries the i18n shape verbatim (crxjs preserves __MSG_* placeholders; Chrome's manifest loader resolves them at install) - dist/_locales/en/messages.json (3.30 KB) - dist/_locales/ru/messages.json (3.81 KB) Verification: - tests/i18n/manifest-i18n.test.ts: 10/10 GREEN - tests/i18n/locale-parity.test.ts: 4/4 GREEN (en↔ru parity, non-empty messages, 16 keys each) - tests/build/no-remote-fonts.test.ts: 4/4 GREEN (post-build dist/ has zero remote font URLs) - Full vitest sweep: 145/147 GREEN (2 RED remaining are popup/style.css tokens-adopted cases — Wave 4 work) Co-Authored-By: Claude Opus 4.7 (1M context) --- _locales/en/messages.json | 66 +++++++++++++++++++++++++++++++++++++++ _locales/ru/messages.json | 66 +++++++++++++++++++++++++++++++++++++++ manifest.json | 6 ++-- 3 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 _locales/en/messages.json create mode 100644 _locales/ru/messages.json diff --git a/_locales/en/messages.json b/_locales/en/messages.json new file mode 100644 index 0000000..fcd3f24 --- /dev/null +++ b/_locales/en/messages.json @@ -0,0 +1,66 @@ +{ + "extName": { + "message": "Mokosh — Session Capture", + "description": "manifest.json:name; surfaces in chrome://extensions, Web Store, right-click menus, and notification titles. Per brand-decisions-v1.md D-07 (override of branding draft A: 'Mokosh' alone). Operator-facing purpose explicit." + }, + "extDesc": { + "message": "Thirty seconds ago, always at hand.", + "description": "manifest.json:description; tagline per brand-decisions-v1.md D-08. Read in Web Store + chrome://extensions card." + }, + "tooltipOff": { + "message": "Mokosh — click to start recording", + "description": "Toolbar action title (chrome.action.setTitle) in OFF state. Click triggers chrome.action.onClicked → startVideoCapture per Plan 01-09 D-16-toolbar." + }, + "tooltipRecPrefix": { + "message": "Mokosh — recording", + "description": "Toolbar action title prefix in REC state. The SW concatenates ' (MM:SS)' at runtime via formatElapsed(seconds) — see src/background/index.ts." + }, + "tooltipErr": { + "message": "Mokosh — recording error, click to recover", + "description": "Toolbar action title in ERROR state. Click reattempts startVideoCapture." + }, + "popupSavePrompt": { + "message": "Save error report?", + "description": "Popup heading copy (currently unused; reserved for future popup layouts that expose the question explicitly)." + }, + "popupSaveCta": { + "message": "Save report", + "description": "Popup primary CTA button text (idle state). Triggers SAVE_ARCHIVE message to SW." + }, + "popupSaveDone": { + "message": "Archive saved to Downloads.", + "description": "Popup status message after SAVE_ARCHIVE success. Used in the saveArchive success branch." + }, + "popupSaving": { + "message": "Saving...", + "description": "Popup CTA text while SAVE_ARCHIVE is in flight." + }, + "popupSaveDoneShort": { + "message": "Done ✓", + "description": "Popup CTA text immediately after SAVE_ARCHIVE success (3-second transient before returning to idle)." + }, + "popupEmptyState": { + "message": "Open recording via the extension icon", + "description": "Popup empty-state status text shown when popup loads without an active recording (rare under Plan 01-09 SAVE-only charter)." + }, + "popupInfoText": { + "message": "Last 30 s video + 10 min log", + "description": "Popup info-text below the SAVE button. Brief explanation of what the archive contains." + }, + "notifStartup": { + "message": "Recording started. I'm watching the last 30 seconds.", + "description": "Notification body for the onStartup + manual-start flow. The notification title is extName." + }, + "notifRecovery": { + "message": "Recording resumed. Buffer refilling.", + "description": "Notification body for the post-RECORDING_ERROR recovery flow. The notification title is extName." + }, + "welcomeHeroRu": { + "message": "Тридцать секунд назад, всегда под рукой.", + "description": "Welcome page hero — Russian-quoted text (rendered alongside the English version in parallel-text layout regardless of locale)." + }, + "welcomeHeroEn": { + "message": "Thirty seconds ago, always at hand.", + "description": "Welcome page hero — English text (rendered alongside the Russian version in parallel-text layout)." + } +} diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json new file mode 100644 index 0000000..47adb24 --- /dev/null +++ b/_locales/ru/messages.json @@ -0,0 +1,66 @@ +{ + "extName": { + "message": "Mokosh — Запись сессии", + "description": "manifest.json:name; отображается в chrome://extensions, Web Store, контекстных меню. Per brand-decisions-v1.md D-07." + }, + "extDesc": { + "message": "Тридцать секунд назад, всегда под рукой.", + "description": "manifest.json:description; слоган per brand-decisions-v1.md D-08." + }, + "tooltipOff": { + "message": "Mokosh — щёлкните, чтобы начать запись", + "description": "Подсказка кнопки на панели инструментов в режиме OFF. Click triggers chrome.action.onClicked → startVideoCapture." + }, + "tooltipRecPrefix": { + "message": "Mokosh — идёт запись", + "description": "Подсказка кнопки в режиме REC; SW добавляет ' (MM:SS)' через formatElapsed(seconds)." + }, + "tooltipErr": { + "message": "Mokosh — ошибка записи, щёлкните для восстановления", + "description": "Подсказка кнопки в режиме ERROR. Click reattempts startVideoCapture." + }, + "popupSavePrompt": { + "message": "Сохранить отчёт об ошибке?", + "description": "Заголовок попапа (зарезервировано для будущих макетов попапа с явным вопросом)." + }, + "popupSaveCta": { + "message": "Сохранить отчёт", + "description": "Текст основной CTA-кнопки попапа (idle state). Триггерит SAVE_ARCHIVE." + }, + "popupSaveDone": { + "message": "Архив сохранён в Загрузки.", + "description": "Статусное сообщение попапа после успешного SAVE_ARCHIVE." + }, + "popupSaving": { + "message": "Сохраняю...", + "description": "Текст CTA-кнопки попапа во время выполнения SAVE_ARCHIVE." + }, + "popupSaveDoneShort": { + "message": "Готово! ✓", + "description": "Текст CTA-кнопки попапа сразу после успешного SAVE_ARCHIVE (3 секунды до возврата в idle)." + }, + "popupEmptyState": { + "message": "Откройте запись через иконку расширения", + "description": "Empty-state статус попапа когда попап открыт без активной записи (редко в режиме SAVE-only из Plan 01-09)." + }, + "popupInfoText": { + "message": "Последние 30 сек видео + 10 мин лога", + "description": "Info-text под SAVE-кнопкой. Краткое описание содержимого архива." + }, + "notifStartup": { + "message": "Запись запущена. Я слежу за последними 30 секундами.", + "description": "Тело уведомления для onStartup + manual-start. Заголовок — extName." + }, + "notifRecovery": { + "message": "Запись возобновлена. Буфер снова заполняется.", + "description": "Тело уведомления после RECORDING_ERROR recovery. Заголовок — extName." + }, + "welcomeHeroRu": { + "message": "Тридцать секунд назад, всегда под рукой.", + "description": "Welcome page hero — Russian text (показывается рядом с английским в parallel-text layout)." + }, + "welcomeHeroEn": { + "message": "Thirty seconds ago, always at hand.", + "description": "Welcome page hero — English text (показывается рядом с русским в parallel-text layout)." + } +} diff --git a/manifest.json b/manifest.json index 5fa1a21..9475042 100644 --- a/manifest.json +++ b/manifest.json @@ -1,8 +1,9 @@ { "manifest_version": 3, - "name": "AI Call Recorder", + "name": "__MSG_extName__", "version": "1.0.0", - "description": "Запись сессий операторов для диагностики ошибок", + "default_locale": "en", + "description": "__MSG_extDesc__", "permissions": [ "desktopCapture", "activeTab", @@ -28,6 +29,7 @@ ], "action": { "default_popup": "src/popup/index.html", + "default_title": "__MSG_tooltipOff__", "default_icon": { "16": "icons/icon16.png", "48": "icons/icon48.png",