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:
yunchan8804 2026-04-08 14:57:27 +09:00
parent a041f1b6a9
commit 3524e958ba
51 changed files with 175 additions and 66 deletions

View file

@ -0,0 +1,282 @@
{
"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": "tiny39 MB最快",
"settings.model.base": "base74 MB均衡",
"settings.model.small": "small244 MB良好",
"settings.model.medium": "medium769 MB優秀",
"settings.model.large": "large-v31.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": "錄音結束後自動識別說話人"
}