d3ro-voice/apps/desktop/electron.vite.config.ts
yunchan8804 3524e958ba 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).
2026-04-08 14:57:27 +09:00

65 lines
1.8 KiB
TypeScript

import { resolve } from 'path'
import { defineConfig, externalizeDepsPlugin } from 'electron-vite'
import react from '@vitejs/plugin-react'
const sharedAlias = {
'@d3ro/core': resolve(__dirname, '../../packages/core/src'),
'@d3ro/ui': resolve(__dirname, '../../packages/ui/src'),
'@d3ro/i18n': resolve(__dirname, '../../packages/i18n/src/index.tsx')
}
const workspaceExclude = ['@d3ro/core', '@d3ro/ui', '@d3ro/i18n']
export default defineConfig({
main: {
plugins: [
externalizeDepsPlugin({
exclude: ['nanoid', 'electron-store', ...workspaceExclude]
})
],
resolve: { alias: sharedAlias }
},
preload: {
plugins: [externalizeDepsPlugin({ exclude: workspaceExclude })],
build: {
rollupOptions: {
input: {
index: resolve(__dirname, 'src/preload/index.ts'),
popup: resolve(__dirname, 'src/preload/popup.ts')
}
}
},
resolve: { alias: sharedAlias }
},
renderer: {
build: {
rollupOptions: {
input: {
index: resolve(__dirname, 'src/renderer/index.html'),
'popups/recording-tip': resolve(
__dirname,
'src/renderer/popups/recording-tip/index.html'
),
'popups/result-popup': resolve(
__dirname,
'src/renderer/popups/result-popup/index.html'
),
'popups/history-popup': resolve(
__dirname,
'src/renderer/popups/history-popup/index.html'
),
'popups/command-popup': resolve(
__dirname,
'src/renderer/popups/command-popup/index.html'
),
'popups/caption-overlay': resolve(
__dirname,
'src/renderer/popups/caption-overlay/index.html'
)
}
}
},
resolve: { alias: sharedAlias },
plugins: [react()]
}
})