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/pt.json Normal file
View file

@ -0,0 +1,208 @@
{
"app.name": "D3RO Voice",
"app.tagline": "Assistente de voz com IA local",
"nav.dashboard": "Painel",
"nav.history": "Histórico",
"nav.dictionary": "Dicionário",
"nav.commands": "Comandos",
"nav.settings": "Configurações",
"dashboard.sessionOverview": "Visão geral da sessão",
"dashboard.systemStatus": "Status do sistema",
"dashboard.sessionsToday": "Sessões hoje",
"dashboard.pressToRecord": "Pressione {{key}} para iniciar a gravação",
"dashboard.hotkeyNotSet": "Atalho não configurado",
"dashboard.words": "palavras",
"dashboard.total": "total",
"dashboard.streak": "sequência",
"dashboard.days": "dias",
"dashboard.recording": "gravando",
"dashboard.sessions": "sessões",
"dashboard.today": "hoje",
"dashboard.recentTranscriptions": "Transcrições recentes",
"dashboard.noHistory": "Sem histórico — pressione o atalho para começar a gravar",
"dashboard.copy": "Copiar",
"dashboard.entries": "{{count}} entradas",
"dashboard.stat": "estatísticas",
"dashboard.sys": "sistema",
"history.title": "Histórico de transcrições",
"history.search": "Pesquisar...",
"history.entries": "{{count}} entradas",
"history.loading": "Carregando...",
"history.noResults": "Sem resultados",
"history.noHistory": "Sem histórico — comece a gravar",
"history.count": "{{count}} entradas",
"dictionary.title": "Dicionário personalizado",
"dictionary.words": "{{count}} palavras",
"dictionary.add": "Adicionar",
"dictionary.search": "Pesquisar...",
"dictionary.loading": "Carregando...",
"dictionary.noResults": "Sem resultados",
"dictionary.noWords": "Sem palavras — adicione palavras personalizadas para melhorar a precisão do STT",
"dictionary.used": "usado {{count}} vezes",
"dictionary.editTitle": "Editar palavra",
"dictionary.addTitle": "Adicionar palavra",
"dictionary.word": "Palavra",
"dictionary.pronunciation": "Pronúncia (opcional)",
"commands.title": "Comandos LLM",
"commands.count": "{{count}} comandos",
"commands.add": "Adicionar",
"commands.activeCommand": "Comando ativo",
"commands.none": "Nenhum",
"commands.loading": "Carregando...",
"commands.noCommands": "Sem comandos — clique em adicionar para criar um",
"commands.editTitle": "Editar comando",
"commands.addTitle": "Adicionar comando",
"commands.name": "Nome",
"commands.description": "Descrição",
"commands.promptTemplate": "Modelo de prompt",
"commands.promptHelp": "{{text}} será substituído pelo texto transcrito",
"commands.defaultPrompt": "Por favor, melhore {{text}}.",
"settings.title": "Configurações",
"settings.tabs.general": "Geral",
"settings.tabs.audio": "Áudio",
"settings.tabs.stt": "STT",
"settings.tabs.llm": "LLM",
"settings.tabs.about": "Sobre",
"settings.shortcuts": "Atalhos",
"settings.dictation": "Ditado",
"settings.dictation.desc": "Mantenha pressionado para falar. A transcrição começa ao soltar.",
"settings.agent": "Modo agente",
"settings.agent.descWithKey": "Clique duas vezes em {{key}} para entrar no modo agente.",
"settings.agent.descNoKey": "Configure primeiro o atalho de ditado.",
"settings.oneTouch": "Modo de um toque",
"settings.oneTouch.desc": "Pressione para iniciar, pressione novamente para parar. Requer um atalho separado.",
"settings.key": "Tecla",
"settings.notSet": "Não configurado",
"settings.enabled": "Ativado",
"settings.disabled": "Desativado",
"settings.interface": "Interface",
"settings.theme": "Tema",
"settings.theme.system": "Sistema",
"settings.theme.light": "Claro",
"settings.theme.dark": "Escuro",
"settings.language": "Idioma",
"settings.appBehavior": "Comportamento do aplicativo",
"settings.closeToTray": "Minimizar para a bandeja",
"settings.autoLaunch": "Iniciar com o sistema",
"settings.autoInsert": "Inserir texto automaticamente após a transcrição",
"settings.soundEffects": "Efeitos sonoros",
"settings.microphone": "Microfone",
"settings.inputDevice": "Dispositivo de entrada",
"settings.deviceDefault": "(padrão)",
"settings.textInsert": "Inserção de texto",
"settings.insertMethod": "Método de inserção",
"settings.insertClipboard": "Área de transferência (Ctrl+V)",
"settings.insertKeyboard": "Digitação pelo teclado",
"settings.whisperModel": "Modelo Whisper",
"settings.model.tiny": "tiny (39 MB, mais rápido)",
"settings.model.base": "base (74 MB, equilibrado)",
"settings.model.small": "small (244 MB, bom)",
"settings.model.medium": "medium (769 MB, muito bom)",
"settings.model.large": "large-v3 (1,5 GB, melhor)",
"settings.sttLanguage": "Idioma de reconhecimento",
"settings.sttLang.auto": "Detecção automática",
"settings.ollamaServer": "Servidor Ollama",
"settings.ollamaUrl": "URL do servidor Ollama",
"settings.ollamaHint": "D3RO Voice conecta-se automaticamente quando o Ollama está em execução. Baixe modelos diretamente pelo Ollama (ex: ollama pull qwen3:4b).",
"settings.postProcess": "Pós-processamento de voz",
"settings.defaultAction": "Ação de pós-processamento padrão",
"settings.action.none": "Nenhuma (texto original sem alterações)",
"settings.action.refine": "Refinar (gramática + naturalidade)",
"settings.action.translate": "Traduzir",
"settings.action.summarize": "Resumir",
"settings.action.grammar": "Correção gramatical",
"settings.action.custom": "Prompt personalizado",
"settings.actionHint": "O pós-processamento LLM selecionado é aplicado ao texto transcrito após gravar com o atalho. Só funciona quando o Ollama está conectado.",
"settings.about.version": "Versão",
"settings.about.techStack": "Stack tecnológico",
"settings.about.techStackValue": "Electron + React 19 + MUI 7 + TypeScript",
"settings.about.voiceEngine": "Motor de voz",
"settings.about.voiceEngineValue": "STT: faster-whisper (local) / LLM: Ollama (local)",
"settings.about.description": "Assistente de voz com IA totalmente local, baseado em engenharia reversa do Speakly. Funciona sem dependências de nuvem.",
"settings.about.restartOnboarding": "Ver guia de configuração inicial novamente",
"status.ollama": "OLLAMA",
"status.offline": "OFFLINE",
"status.nudge.title": "Ollama não está em execução",
"status.nudge.desc": "O Ollama é necessário para o pós-processamento LLM (tradução, resumo, etc.).",
"status.nudge.guide": "Ver guia de instalação →",
"onboarding.welcome.title": "D3RO-VOICE",
"onboarding.welcome.desc": "Sem digitar, por voz. Seu assistente de voz com IA local.",
"onboarding.welcome.start": "Começar",
"onboarding.mic.title": "Configurar microfone",
"onboarding.mic.desc": "Selecione o microfone que deseja usar. Você pode alterá-lo depois nas configurações.",
"onboarding.hotkey.title": "Configurar atalho",
"onboarding.hotkey.desc": "Configure o atalho de ditado. A gravação continua enquanto você mantiver a tecla pressionada.",
"onboarding.hotkey.notSet": "Nenhum atalho configurado",
"onboarding.hotkey.change": "Alterar atalho",
"onboarding.hotkey.set": "Configurar atalho",
"onboarding.ollama.title": "Instalar Ollama (opcional)",
"onboarding.ollama.desc": "O Ollama é necessário para pós-processamento LLM como tradução ou resumo. O ditado de voz funciona sem o Ollama.",
"onboarding.ollama.download": "Baixar Ollama",
"onboarding.ollama.modelHint": "Após instalar, baixe um modelo pelo terminal",
"onboarding.done.title": "Configuração concluída!",
"onboarding.done.descWithKey": "Mantenha {{key}} pressionado e fale para converter sua voz em texto.",
"onboarding.done.descNoKey": "Configure um atalho nas configurações para começar a ditar.",
"onboarding.done.start": "Começar",
"onboarding.back": "Voltar",
"onboarding.next": "Próximo",
"hotkey.title": "Configurar atalho",
"hotkey.dictationTitle": "Configurar atalho de ditado",
"hotkey.oneTouchTitle": "Configurar atalho do modo de um toque",
"hotkey.prompt": "Pressione uma combinação de teclas...",
"hotkey.ready": "✓ {{keys}} — pressione salvar",
"hotkey.noKey": "Por favor, insira uma tecla",
"hotkey.reserved": "{{keys}} é um atalho reservado pelo sistema",
"hotkey.current": "Atual: {{keys}}",
"hotkey.hint": "Insira uma combinação (ex: Ctrl+Shift+Q) ou uma tecla única (ex: F5)",
"hotkey.reset": "Inserir novamente",
"ollama.title": "GUIA DE CONFIGURAÇÃO DO OLLAMA",
"ollama.step1.title": "PASSO 1 — Instalar o Ollama",
"ollama.step1.desc": "O Ollama é uma ferramenta gratuita para executar LLMs localmente.",
"ollama.step2.title": "PASSO 2 — Baixar um modelo",
"ollama.step2.desc": "Execute o seguinte comando no terminal para baixar o modelo recomendado:",
"ollama.step2.alt": "Ou um modelo maior: ollama pull qwen3:8b (mais preciso, mais lento)",
"ollama.step3.title": "PASSO 3 — Conexão automática",
"ollama.step3.desc": "D3RO-VOICE detecta automaticamente quando o Ollama está em execução. Quando o LED da barra de status mudar de vermelho para verde, está pronto!",
"service.sttEngine": "MOTOR STT",
"service.ollamaLlm": "OLLAMA LLM",
"service.hotkeyHook": "ATALHO DE TECLADO",
"service.audioInput": "ENTRADA DE ÁUDIO",
"service.ready": "PRONTO",
"service.connected": "CONECTADO",
"service.offline": "OFFLINE",
"service.active": "ATIVO",
"service.standby": "EM ESPERA",
"common.cancel": "Cancelar",
"common.save": "Salvar",
"common.delete": "Excluir",
"common.add": "Adicionar",
"common.edit": "Editar",
"common.close": "Fechar",
"common.confirm": "Confirmar",
"common.loading": "Carregando...",
"common.copy": "Copiar",
"common.test": "Testar",
"common.stop": "Parar",
"date.today": "Hoje",
"date.yesterday": "Ontem"
}