feat(V2-1d): packages/i18n 추출 — Electron 독립 i18n 엔진
packages/i18n (@d3ro/i18n) 신규:
- src/locales/ 12개 JSON (ko/en/ja/zh/zh-TW/es/fr/de/pt/ru/vi/th)
- src/index.tsx: TFunction/Locale/LOCALE_META/resolveTranslation/
포맷 유틸(createFormatDate/Number/RelativeDate/Time)/
I18nContext/useI18n/I18nProvider
Electron 독립성 확보 (monorepo 원칙 준수):
- I18nStorage interface 신설 (load/save 어댑터 추상화)
- window.electronAPI.config 직접 호출 제거
- I18nProvider는 storage prop으로 영속화 어댑터 주입
- 기본값 noopStorage (메모리 한정, 세션 범위)
- 결과: packages/i18n은 React에만 의존, web/mobile에서 재사용 가능
apps/desktop 어댑터:
- App.tsx에 electronI18nStorage 구현 (config.get/set 래핑)
- <I18nProvider storage={electronI18nStorage}>로 주입
apps/desktop 설정:
- package.json: @d3ro/i18n '*' dep 추가
- tsconfig.node/web.json paths에 @d3ro/i18n 추가
- electron.vite.config.ts alias + externalize exclude 추가
- vitest.config.ts alias 추가
일괄 치환 (29 파일):
- ./i18n, ../i18n, ../../i18n → @d3ro/i18n
apps/desktop/src/renderer/i18n/ 디렉토리 완전 제거.
검증: typecheck + build + dev 런타임 모두 통과.
Phase V2-1 전체 완료 (a/b/c/d).
This commit is contained in:
parent
a041f1b6a9
commit
3524e958ba
51 changed files with 175 additions and 66 deletions
|
|
@ -1,282 +0,0 @@
|
|||
{
|
||||
"app.name": "D3RO Voice",
|
||||
"app.tagline": "本地AI语音助手",
|
||||
"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": "Agent模式",
|
||||
"settings.agent.descWithKey": "双击 {{key}} 进入Agent模式。",
|
||||
"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 MB,最快)",
|
||||
"settings.model.base": "base(74 MB,均衡)",
|
||||
"settings.model.small": "small(244 MB,良好)",
|
||||
"settings.model.medium": "medium(769 MB,优秀)",
|
||||
"settings.model.large": "large-v3(1.5 GB,最佳)",
|
||||
"settings.sttLanguage": "识别语言",
|
||||
"settings.sttLang.auto": "自动检测",
|
||||
"settings.ollamaServer": "Ollama服务器",
|
||||
"settings.ollamaUrl": "Ollama服务器URL",
|
||||
"settings.ollamaHint": "Ollama运行时将自动连接。请直接在Ollama中pull模型(例如: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逆向工程经验构建的本地AI语音助手,无需依赖云端,完全在本地运行。",
|
||||
"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": "无需打字,用声音操作。本地AI语音助手。",
|
||||
"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。语音听写本身无需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": "STEP 1 — 安装Ollama",
|
||||
"ollama.step1.desc": "Ollama是一款在本地运行LLM的免费工具。",
|
||||
"ollama.step2.title": "STEP 2 — 下载模型",
|
||||
"ollama.step2.desc": "在终端中pull所需模型。推荐中文模型:",
|
||||
"ollama.step2.alt": "或更大的模型:ollama pull qwen3:8b(更精准,更慢)",
|
||||
"ollama.step3.title": "STEP 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": "昨天",
|
||||
"settings.theme.nord": "Nord",
|
||||
"settings.theme.solarized": "Solarized",
|
||||
"settings.theme.catppuccin": "Catppuccin",
|
||||
"settings.theme.dracula": "Dracula",
|
||||
"settings.sttLang.ko": "韩语",
|
||||
"settings.sttLang.en": "English",
|
||||
"settings.sttLang.ja": "日语",
|
||||
"settings.sttLang.zh": "中文",
|
||||
"template.outputHelperText": "使用 {{字段名}} 作为占位符",
|
||||
"nav.meeting": "会议",
|
||||
"meeting.title": "会议模式",
|
||||
"meeting.newMeeting": "新建会议",
|
||||
"meeting.startRecording": "开始录音",
|
||||
"meeting.stopRecording": "停止录音",
|
||||
"meeting.recording": "录音中",
|
||||
"meeting.processing": "正在生成会议纪要...",
|
||||
"meeting.completed": "已完成",
|
||||
"meeting.error": "错误",
|
||||
"meeting.elapsed": "已用时",
|
||||
"meeting.memoPlaceholder": "输入备忘(Enter 添加)",
|
||||
"meeting.memoAdded": "备忘已添加",
|
||||
"meeting.noSessions": "暂无会议录音",
|
||||
"meeting.noSessionsDesc": "点击「新建会议」开始录音",
|
||||
"meeting.summary": "摘要",
|
||||
"meeting.decisions": "决议",
|
||||
"meeting.actionItems": "待办事项",
|
||||
"meeting.timeline": "时间轴",
|
||||
"meeting.transcript": "原始转录",
|
||||
"meeting.memos": "备忘",
|
||||
"meeting.exportPdf": "导出 PDF",
|
||||
"meeting.exportMarkdown": "导出 Markdown",
|
||||
"meeting.delete": "删除",
|
||||
"meeting.deleteConfirm": "删除此会议记录?",
|
||||
"meeting.backToList": "返回列表",
|
||||
"meeting.notificationTitle": "会议纪要已就绪",
|
||||
"meeting.notificationBody": "会议纪要已生成。",
|
||||
"meeting.sessions": "{{count}} 场会议",
|
||||
"meeting.duration": "{{minutes}} 分钟",
|
||||
"meeting.editTitle": "编辑标题",
|
||||
"meeting.untitled": "无标题会议",
|
||||
"meeting.processingStep.merging": "正在合并转录...",
|
||||
"meeting.processingStep.generating": "正在用 LLM 生成会议纪要...",
|
||||
"meeting.processingStep.parsing": "正在解析会议纪要...",
|
||||
"meeting.processingStep.saving": "正在保存...",
|
||||
"meeting.processingStep.notifying": "正在发送通知...",
|
||||
"meeting.transcriptTab": "转录",
|
||||
"meeting.addDocument": "添加文档",
|
||||
"meeting.selectTemplate": "选择模板",
|
||||
"meeting.generate": "生成",
|
||||
"meeting.generating": "正在生成文档...",
|
||||
"meeting.editMode": "编辑",
|
||||
"meeting.previewMode": "预览",
|
||||
"meeting.modified": "已修改",
|
||||
"meeting.originalText": "原文",
|
||||
"meeting.editedText": "编辑版",
|
||||
"meeting.exportDocx": "导出 DOCX",
|
||||
"meeting.exportTxt": "导出 TXT",
|
||||
"meeting.exportFormat": "导出",
|
||||
"meeting.customPrompt": "自定义提示",
|
||||
"meeting.templateName": "模板名称",
|
||||
"meeting.templatePrompt": "AI 提示",
|
||||
"meeting.templateSave": "保存模板",
|
||||
"meeting.documentDeleted": "文档已删除",
|
||||
"meeting.autoSaved": "已自动保存",
|
||||
"meeting.minutesTemplate": "会议记录",
|
||||
"meeting.reportTemplate": "报告",
|
||||
"meeting.ideaNoteTemplate": "创意笔记",
|
||||
"meeting.customTemplate": "自定义",
|
||||
"meeting.downloadTranscript": "下载转录",
|
||||
"meeting.polish": "AI 润色",
|
||||
"meeting.polishing": "AI 正在润色转录...",
|
||||
"meeting.polished": "AI 润色完成",
|
||||
"meeting.mindmapTemplate": "思维导图",
|
||||
"meeting.chat": "AI 聊天",
|
||||
"meeting.chatPlaceholder": "询问关于会议的内容...",
|
||||
"meeting.chatSend": "发送",
|
||||
"meeting.chatClear": "清空聊天",
|
||||
"meeting.copyToClipboard": "复制到剪贴板",
|
||||
"meeting.copied": "已复制",
|
||||
"meeting.chatCollapse": "收起聊天",
|
||||
"meeting.chatExpand": "展开聊天",
|
||||
"meeting.exportMd": "Markdown (.md)",
|
||||
"meeting.exportPdfFmt": "PDF (.pdf)",
|
||||
"meeting.polishFailed": "AI润色失败",
|
||||
"meeting.viewDetailError": "无法加载会议详情",
|
||||
"meeting.startRecordingError": "无法开始录音",
|
||||
"meeting.diarize": "说话人分离",
|
||||
"meeting.diarizing": "正在识别说话人...",
|
||||
"meeting.diarizeComplete": "说话人分离完成",
|
||||
"meeting.speaker": "说话人",
|
||||
"settings.hfToken": "HuggingFace令牌",
|
||||
"settings.hfTokenHint": "说话人分离需要HuggingFace令牌",
|
||||
"settings.diarization": "说话人分离",
|
||||
"settings.diarizationHint": "录音结束后自动识别说话人"
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue