Phase 10~11 전체 구현: 킬러 피처 5종 + 수익화 시스템

Phase 10 킬러 피처:
- MemoService: 태그 CRUD + 마크다운 내보내기 (memo_tags DB)
- VoiceCommandService: 키워드→명령어 매칭, 프리셋 4종
- ScreenContextService: PowerShell 활성 윈도우 + Ctrl+C 선택 텍스트
- ChainService: LLM 명령어 순차 실행 파이프라인
- CaptionService: 6초 청크 연속 전사 + 시스템 오디오 루프백

VoiceModeService 파이프라인 통합:
- 녹음 시작 → 컨텍스트 캡처 → STT → 키워드 매칭 → LLM(체인/컨텍스트 주입) → 삽입

시스템 오디오 캡처:
- setDisplayMediaRequestHandler + audio: 'loopback' (IPC 브릿지)
- electron-audio-loopback 패키지 contextIsolation 호환 불가 → 직접 구현

Phase 11 수익화:
- LicenseService: Free/Pro/Pro+ 3티어, LemonSqueezy API
- Feature Gate: requireFeature/checkFeature/consumeFeature
- 일일 쿼터: Free dictation 20/일, LLM 10/일 (SQLite daily_usage)
- LicenseModal, ProBadge, UpgradePromptModal UI

디자인 보강:
- d3roTypo(13종), d3roShadow(10종), d3roRadius(7종) 토큰 시스템
- ScreenPanel, ButtonGroup DS 컴포넌트 신규
- PhosphorText 4→13종 변형, MetalDial conic-gradient 광택
- 공유 컴포넌트: EmptyStateCard, SearchInput, PageHeader, HistoryEntryCard

기타:
- 자막 핫키 SSOT 전체 연동 (Config→Hotkey→VoiceMode→Caption→Settings)
- StatusBar 자막 LED + 효과음, 자막 로딩 UI
- LLM 상태 이벤트 전파 수정 (폴링 제거 → onStatusChanged)
- 커맨드 팝업 "선택 해제" 항목 추가
This commit is contained in:
Yun Chan 2026-04-05 21:36:09 +09:00
parent 36d77ca224
commit a31f96bbb8
97 changed files with 11853 additions and 1143 deletions

208
src/renderer/i18n/ru.json Normal file
View file

@ -0,0 +1,208 @@
{
"app.name": "D3RO Voice",
"app.tagline": "Локальный голосовой ИИ-ассистент",
"nav.dashboard": "Панель",
"nav.history": "История",
"nav.dictionary": "Словарь",
"nav.commands": "Команды",
"nav.settings": "Настройки",
"dashboard.sessionOverview": "Обзор сессий",
"dashboard.systemStatus": "Состояние системы",
"dashboard.sessionsToday": "Сессий сегодня",
"dashboard.pressToRecord": "Нажмите {{key}} для начала записи",
"dashboard.hotkeyNotSet": "Горячая клавиша не задана",
"dashboard.words": "Слова",
"dashboard.total": "Всего",
"dashboard.streak": "Серия",
"dashboard.days": "дн.",
"dashboard.recording": "Запись",
"dashboard.sessions": "Сессии",
"dashboard.today": "Сегодня",
"dashboard.recentTranscriptions": "Последние транскрипции",
"dashboard.noHistory": "История пуста — нажмите горячую клавишу для начала записи",
"dashboard.copy": "Копировать",
"dashboard.entries": "{{count}} записей",
"dashboard.stat": "Статистика",
"dashboard.sys": "Система",
"history.title": "История транскрипций",
"history.search": "Поиск...",
"history.entries": "{{count}} записей",
"history.loading": "Загрузка...",
"history.noResults": "Результаты не найдены",
"history.noHistory": "История пуста — начните запись",
"history.count": "{{count}} записей",
"dictionary.title": "Пользовательский словарь",
"dictionary.words": "{{count}} слов",
"dictionary.add": "Добавить",
"dictionary.search": "Поиск...",
"dictionary.loading": "Загрузка...",
"dictionary.noResults": "Результаты не найдены",
"dictionary.noWords": "Слов нет — добавьте собственные слова для улучшения точности STT",
"dictionary.used": "Использовано {{count}} раз",
"dictionary.editTitle": "Редактировать слово",
"dictionary.addTitle": "Добавить слово",
"dictionary.word": "Слово",
"dictionary.pronunciation": "Произношение (необязательно)",
"commands.title": "Команды LLM",
"commands.count": "{{count}} шт.",
"commands.add": "Добавить",
"commands.activeCommand": "Активная команда",
"commands.none": "Нет",
"commands.loading": "Загрузка...",
"commands.noCommands": "Команд нет — нажмите «Добавить» для создания",
"commands.editTitle": "Редактировать команду",
"commands.addTitle": "Добавить команду",
"commands.name": "Название",
"commands.description": "Описание",
"commands.promptTemplate": "Шаблон промпта",
"commands.promptHelp": "{{text}} будет заменено на транскрибированный текст",
"commands.defaultPrompt": "Пожалуйста, улучшите {{text}}.",
"settings.title": "Настройки",
"settings.tabs.general": "Общие",
"settings.tabs.audio": "Аудио",
"settings.tabs.stt": "STT",
"settings.tabs.llm": "LLM",
"settings.tabs.about": "О программе",
"settings.shortcuts": "Горячие клавиши",
"settings.dictation": "Диктовка",
"settings.dictation.desc": "Говорите, удерживая клавишу. Отпустите для начала транскрипции.",
"settings.agent": "Режим агента",
"settings.agent.descWithKey": "Дважды нажмите {{key}} для перехода в режим агента.",
"settings.agent.descNoKey": "Сначала задайте горячую клавишу диктовки.",
"settings.oneTouch": "Режим одного нажатия",
"settings.oneTouch.desc": "Нажмите для начала, нажмите снова для остановки. Требуется отдельная горячая клавиша.",
"settings.key": "Клавиша",
"settings.notSet": "Не задано",
"settings.enabled": "Включено",
"settings.disabled": "Выключено",
"settings.interface": "Интерфейс",
"settings.theme": "Тема",
"settings.theme.system": "Системная",
"settings.theme.light": "Светлая",
"settings.theme.dark": "Тёмная",
"settings.language": "Язык",
"settings.appBehavior": "Поведение приложения",
"settings.closeToTray": "Сворачивать в трей",
"settings.autoLaunch": "Автозапуск при старте системы",
"settings.autoInsert": "Автоматически вставлять текст после транскрипции",
"settings.soundEffects": "Звуковые эффекты",
"settings.microphone": "Микрофон",
"settings.inputDevice": "Устройство ввода",
"settings.deviceDefault": "(По умолчанию)",
"settings.textInsert": "Вставка текста",
"settings.insertMethod": "Метод вставки",
"settings.insertClipboard": "Буфер обмена (Ctrl+V)",
"settings.insertKeyboard": "Эмуляция клавиатуры",
"settings.whisperModel": "Модель Whisper",
"settings.model.tiny": "tiny (39 МБ, самая быстрая)",
"settings.model.base": "base (74 МБ, баланс)",
"settings.model.small": "small (244 МБ, хорошая)",
"settings.model.medium": "medium (769 МБ, отличная)",
"settings.model.large": "large-v3 (1.5 ГБ, лучшая)",
"settings.sttLanguage": "Язык распознавания",
"settings.sttLang.auto": "Автоопределение",
"settings.ollamaServer": "Сервер Ollama",
"settings.ollamaUrl": "URL сервера Ollama",
"settings.ollamaHint": "Если Ollama запущена, подключение произойдёт автоматически. Загружайте модели напрямую через Ollama (например: ollama pull qwen3:4b).",
"settings.postProcess": "Постобработка речи",
"settings.defaultAction": "Команда постобработки по умолчанию",
"settings.action.none": "Нет (оригинальный текст)",
"settings.action.refine": "Улучшить (грамматика + естественность)",
"settings.action.translate": "Перевести",
"settings.action.summarize": "Резюмировать",
"settings.action.grammar": "Исправить грамматику",
"settings.action.custom": "Пользовательский промпт",
"settings.actionHint": "После записи и транскрипции к тексту будет применена выбранная постобработка LLM. Работает только при подключённом Ollama.",
"settings.about.version": "Версия",
"settings.about.techStack": "Технический стек",
"settings.about.techStackValue": "Electron + React 19 + MUI 7 + TypeScript",
"settings.about.voiceEngine": "Голосовой движок",
"settings.about.voiceEngineValue": "STT: faster-whisper (локально) / LLM: Ollama (локально)",
"settings.about.description": "Локальный голосовой ИИ-ассистент, основанный на методах обратной разработки Speakly. Работает полностью локально без зависимости от облачных сервисов.",
"settings.about.restartOnboarding": "Показать начальную настройку снова",
"status.ollama": "OLLAMA",
"status.offline": "OFFLINE",
"status.nudge.title": "Ollama не запущена",
"status.nudge.desc": "Для постобработки LLM (перевод, резюмирование и т.д.) требуется Ollama.",
"status.nudge.guide": "Смотреть инструкцию по установке →",
"onboarding.welcome.title": "D3RO-VOICE",
"onboarding.welcome.desc": "Без набора текста — только голос. Локальный голосовой ИИ-ассистент.",
"onboarding.welcome.start": "Начать",
"onboarding.mic.title": "Настройка микрофона",
"onboarding.mic.desc": "Выберите микрофон. Его можно изменить позже в настройках.",
"onboarding.hotkey.title": "Настройка горячей клавиши",
"onboarding.hotkey.desc": "Задайте горячую клавишу для диктовки. Удерживайте её для записи.",
"onboarding.hotkey.notSet": "Горячая клавиша не задана",
"onboarding.hotkey.change": "Изменить горячую клавишу",
"onboarding.hotkey.set": "Задать горячую клавишу",
"onboarding.ollama.title": "Установка Ollama (необязательно)",
"onboarding.ollama.desc": "Для постобработки LLM (перевод, резюмирование и т.д.) требуется Ollama. Голосовая диктовка работает и без неё.",
"onboarding.ollama.download": "Скачать Ollama",
"onboarding.ollama.modelHint": "После установки загрузите модель через терминал",
"onboarding.done.title": "Настройка завершена!",
"onboarding.done.descWithKey": "Удерживайте {{key}} и говорите — речь будет преобразована в текст.",
"onboarding.done.descNoKey": "Задайте горячую клавишу в настройках, чтобы начать голосовую диктовку.",
"onboarding.done.start": "Начать",
"onboarding.back": "Назад",
"onboarding.next": "Далее",
"hotkey.title": "Настройка горячей клавиши",
"hotkey.dictationTitle": "Задать горячую клавишу диктовки",
"hotkey.oneTouchTitle": "Задать горячую клавишу режима одного нажатия",
"hotkey.prompt": "Нажмите сочетание клавиш...",
"hotkey.ready": "✓ {{keys}} — нажмите «Сохранить»",
"hotkey.noKey": "Введите клавишу",
"hotkey.reserved": "{{keys}} является зарезервированным сочетанием системы",
"hotkey.current": "Текущее: {{keys}}",
"hotkey.hint": "Введите сочетание клавиш (например: Ctrl+Shift+Q) или одну клавишу (например: F5)",
"hotkey.reset": "Ввести снова",
"ollama.title": "OLLAMA SETUP GUIDE",
"ollama.step1.title": "ШАГ 1 — Установка Ollama",
"ollama.step1.desc": "Ollama — бесплатный инструмент для локального запуска LLM.",
"ollama.step2.title": "ШАГ 2 — Загрузка модели",
"ollama.step2.desc": "Загрузите нужную модель через терминал. Рекомендуется:",
"ollama.step2.alt": "Или более крупная модель: ollama pull qwen3:8b (точнее, медленнее)",
"ollama.step3.title": "ШАГ 3 — Автоподключение",
"ollama.step3.desc": "При запуске Ollama D3RO-VOICE обнаружит её автоматически. Когда индикатор LED на нижней панели сменится с красного на зелёный — готово!",
"service.sttEngine": "STT ENGINE",
"service.ollamaLlm": "OLLAMA LLM",
"service.hotkeyHook": "HOTKEY HOOK",
"service.audioInput": "AUDIO INPUT",
"service.ready": "READY",
"service.connected": "CONNECTED",
"service.offline": "OFFLINE",
"service.active": "ACTIVE",
"service.standby": "STANDBY",
"common.cancel": "Отмена",
"common.save": "Сохранить",
"common.delete": "Удалить",
"common.add": "Добавить",
"common.edit": "Изменить",
"common.close": "Закрыть",
"common.confirm": "Подтвердить",
"common.loading": "Загрузка...",
"common.copy": "Копировать",
"common.test": "Тест",
"common.stop": "Стоп",
"date.today": "Сегодня",
"date.yesterday": "Вчера"
}