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
|
|
@ -24,8 +24,8 @@ import { LicenseModal } from './LicenseModal'
|
|||
import { OnboardingModal } from './OnboardingModal'
|
||||
import { StatusBar } from './StatusBar'
|
||||
import { d3roPalette, d3roFontMono, d3roTypo, d3roShadow, d3roRadius } from '@d3ro/ui/theme'
|
||||
import { useI18n } from '../i18n'
|
||||
import type { TranslationKey } from '../i18n'
|
||||
import { useI18n } from '@d3ro/i18n'
|
||||
import type { TranslationKey } from '@d3ro/i18n'
|
||||
import type { LicenseTier } from '@d3ro/core/types'
|
||||
|
||||
type Route = 'dashboard' | 'history' | 'dictionary' | 'commands' | 'conversation' | 'knowledge' | 'meeting'
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import CloseIcon from '@mui/icons-material/Close'
|
|||
import UploadFileIcon from '@mui/icons-material/UploadFile'
|
||||
import { MetalCard, PhosphorText, Led } from '@d3ro/ui/components/ds'
|
||||
import { d3roPalette, d3roTypo } from '@d3ro/ui/theme'
|
||||
import { useI18n } from '../i18n'
|
||||
import { useI18n } from '@d3ro/i18n'
|
||||
import type {
|
||||
FileTranscriptionProgress,
|
||||
FileTranscriptionResult,
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ import {
|
|||
Typography,
|
||||
} from '@mui/material'
|
||||
import { d3roPalette } from '@d3ro/ui/theme'
|
||||
import { useI18n } from '../i18n'
|
||||
import { useI18n } from '@d3ro/i18n'
|
||||
import type { HotkeyBinding } from '@d3ro/core/types'
|
||||
|
||||
// ── 키 이름 매핑 (Windows) ──────────────────────────────
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ import CheckCircleIcon from '@mui/icons-material/CheckCircle'
|
|||
import CancelIcon from '@mui/icons-material/Cancel'
|
||||
import { MetalCard, PhosphorText, Led, ScreenPanel, PhysicalButton } from '@d3ro/ui/components/ds'
|
||||
import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius, d3roShadow } from '@d3ro/ui/theme'
|
||||
import { useI18n } from '../i18n'
|
||||
import { useI18n } from '@d3ro/i18n'
|
||||
import type { LicenseInfo, LicenseTier, TierComparison, UsageQuota } from '@d3ro/core/types'
|
||||
|
||||
interface LicenseModalProps {
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ import {
|
|||
import CheckCircleIcon from '@mui/icons-material/CheckCircle'
|
||||
import CancelIcon from '@mui/icons-material/Cancel'
|
||||
import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius } from '@d3ro/ui/theme'
|
||||
import { useI18n } from '../i18n'
|
||||
import { useI18n } from '@d3ro/i18n'
|
||||
import type {
|
||||
LicenseInfo,
|
||||
LicenseTier,
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ import OpenInNewIcon from '@mui/icons-material/OpenInNew'
|
|||
import ContentCopyIcon from '@mui/icons-material/ContentCopy'
|
||||
import { d3roPalette, d3roFontMono, d3roShadow } from '@d3ro/ui/theme'
|
||||
import { Led } from '@d3ro/ui/components/ds'
|
||||
import { useI18n } from '../i18n'
|
||||
import { useI18n } from '@d3ro/i18n'
|
||||
|
||||
interface OllamaGuideModalProps {
|
||||
open: boolean
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ import OpenInNewIcon from '@mui/icons-material/OpenInNew'
|
|||
import { d3roPalette, d3roFontMono, d3roShadow } from '@d3ro/ui/theme'
|
||||
import { Led } from '@d3ro/ui/components/ds'
|
||||
import { HotkeyRecordModal } from './HotkeyRecordModal'
|
||||
import { useI18n } from '../i18n'
|
||||
import { useI18n } from '@d3ro/i18n'
|
||||
import type { HotkeyBinding, AudioDevice } from '@d3ro/core/types'
|
||||
|
||||
interface OnboardingModalProps {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import { Box, Typography } from '@mui/material'
|
|||
import LockIcon from '@mui/icons-material/Lock'
|
||||
import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius } from '@d3ro/ui/theme'
|
||||
import { useProFeature } from '../hooks/useProFeature'
|
||||
import { useI18n } from '../i18n'
|
||||
import { useI18n } from '@d3ro/i18n'
|
||||
import type { Feature } from '@d3ro/core/types'
|
||||
|
||||
interface ProBadgeProps {
|
||||
|
|
|
|||
|
|
@ -34,8 +34,8 @@ import CancelIcon from '@mui/icons-material/Cancel'
|
|||
import { d3roPalette, d3roFontMono, d3roShadow } from '@d3ro/ui/theme'
|
||||
import { HotkeyRecordModal } from './HotkeyRecordModal'
|
||||
import { LicenseTab } from './LicenseTab'
|
||||
import { useI18n, LOCALE_META } from '../i18n'
|
||||
import type { Locale } from '../i18n'
|
||||
import { useI18n, LOCALE_META } from '@d3ro/i18n'
|
||||
import type { Locale } from '@d3ro/i18n'
|
||||
import type { ThemeMode, AppConfig, HotkeyBinding, AudioDevice } from '@d3ro/core/types'
|
||||
import { Feature } from '@d3ro/core/types'
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import CloseIcon from '@mui/icons-material/Close'
|
|||
import { Led } from '@d3ro/ui/components/ds'
|
||||
import { d3roPalette, d3roFontMono, d3roTypo, d3roShadow, d3roRadius } from '@d3ro/ui/theme'
|
||||
import { OllamaGuideModal } from './OllamaGuideModal'
|
||||
import { useI18n } from '../i18n'
|
||||
import { useI18n } from '@d3ro/i18n'
|
||||
import type { LLMStatus } from '@d3ro/core/types'
|
||||
|
||||
export function StatusBar(): React.ReactElement {
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ import PlayArrowIcon from '@mui/icons-material/PlayArrow'
|
|||
import { MetalCard, PhosphorText, Led, PhysicalButton } from '@d3ro/ui/components/ds'
|
||||
import { PageHeader, EmptyStateCard } from './shared'
|
||||
import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius } from '@d3ro/ui/theme'
|
||||
import { useI18n } from '../i18n'
|
||||
import { useI18n } from '@d3ro/i18n'
|
||||
import type { DictationTemplate, TemplateField, TemplateSessionInfo } from '@d3ro/core/types'
|
||||
|
||||
export function TemplateSection(): React.ReactElement {
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ import {
|
|||
import LockIcon from '@mui/icons-material/Lock'
|
||||
import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline'
|
||||
import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius, d3roShadow } from '@d3ro/ui/theme'
|
||||
import { useI18n } from '../i18n'
|
||||
import { useI18n } from '@d3ro/i18n'
|
||||
import type { UpgradePromptEvent, UsageQuota } from '@d3ro/core/types'
|
||||
|
||||
export function UpgradePromptModal(): React.ReactElement {
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ import { MetalCard } from '@d3ro/ui/components/ds'
|
|||
import { PhosphorText } from '@d3ro/ui/components/ds'
|
||||
import { PhysicalButton } from '@d3ro/ui/components/ds'
|
||||
import { d3roPalette, d3roTypo, d3roRadius, d3roShadow } from '@d3ro/ui/theme'
|
||||
import { useI18n } from '../../i18n'
|
||||
import { useI18n } from '@d3ro/i18n'
|
||||
|
||||
interface TemplateItem {
|
||||
id: string
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import { MarkdownEditor } from './MarkdownEditor'
|
|||
import { ExportMenu } from './ExportMenu'
|
||||
import { PhysicalButton } from '@d3ro/ui/components/ds'
|
||||
import { d3roPalette, d3roTypo } from '@d3ro/ui/theme'
|
||||
import { useI18n } from '../../i18n'
|
||||
import { useI18n } from '@d3ro/i18n'
|
||||
import type { MeetingExportFormat } from '@d3ro/core/types'
|
||||
|
||||
interface DocumentTabDoc {
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
import { useState, useRef, useCallback } from 'react'
|
||||
import { Box, TextField, Tooltip, Chip } from '@mui/material'
|
||||
import { d3roPalette, d3roFontMono } from '@d3ro/ui/theme'
|
||||
import { useI18n } from '../../i18n'
|
||||
import { useI18n } from '@d3ro/i18n'
|
||||
|
||||
// Phase 15.5: 화자별 색상 매핑 (d3roPalette SSOT)
|
||||
const SPEAKER_COLORS = [
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import { Menu, MenuItem } from '@mui/material'
|
|||
import FileDownloadIcon from '@mui/icons-material/FileDownload'
|
||||
import { PhysicalButton } from '@d3ro/ui/components/ds'
|
||||
import { d3roPalette, d3roTypo, d3roFontMono, d3roRadius, d3roShadow } from '@d3ro/ui/theme'
|
||||
import { useI18n } from '../../i18n'
|
||||
import { useI18n } from '@d3ro/i18n'
|
||||
import type { MeetingExportFormat } from '@d3ro/core/types'
|
||||
|
||||
interface ExportMenuProps {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import { Box } from '@mui/material'
|
|||
import { MarkdownRenderer } from './MarkdownRenderer'
|
||||
import { PhysicalButton } from '@d3ro/ui/components/ds'
|
||||
import { d3roPalette, d3roFontMono, d3roTypo, d3roShadow, d3roRadius } from '@d3ro/ui/theme'
|
||||
import { useI18n } from '../../i18n'
|
||||
import { useI18n } from '@d3ro/i18n'
|
||||
|
||||
interface MarkdownEditorProps {
|
||||
content: string
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ import ExpandMoreIcon from '@mui/icons-material/ExpandMore'
|
|||
import { PhosphorText } from '@d3ro/ui/components/ds'
|
||||
import { PhysicalButton } from '@d3ro/ui/components/ds'
|
||||
import { d3roPalette, d3roFontMono, d3roTypo, d3roShadow } from '@d3ro/ui/theme'
|
||||
import { useI18n } from '../../i18n'
|
||||
import { useI18n } from '@d3ro/i18n'
|
||||
import type { MeetingChatMessage } from '@d3ro/core/types'
|
||||
|
||||
interface MeetingChatPanelProps {
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ import { AddDocumentDialog } from './AddDocumentDialog'
|
|||
import { MeetingChatPanel } from './MeetingChatPanel'
|
||||
import { PhosphorText } from '@d3ro/ui/components/ds'
|
||||
import { d3roPalette, d3roFontMono, d3roTypo } from '@d3ro/ui/theme'
|
||||
import { useI18n } from '../../i18n'
|
||||
import { useI18n } from '@d3ro/i18n'
|
||||
import type {
|
||||
MeetingSessionDetail,
|
||||
MeetingDocument,
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ import { EditableSegment } from './EditableSegment'
|
|||
import { PhysicalButton } from '@d3ro/ui/components/ds'
|
||||
import { PhosphorText } from '@d3ro/ui/components/ds'
|
||||
import { d3roPalette, d3roFontMono, d3roTypo } from '@d3ro/ui/theme'
|
||||
import { useI18n } from '../../i18n'
|
||||
import { useI18n } from '@d3ro/i18n'
|
||||
import FileDownloadIcon from '@mui/icons-material/FileDownload'
|
||||
import AutoFixHighIcon from '@mui/icons-material/AutoFixHigh'
|
||||
import RecordVoiceOverIcon from '@mui/icons-material/RecordVoiceOver'
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import SummarizeIcon from '@mui/icons-material/Summarize'
|
|||
import ExpandMoreIcon from '@mui/icons-material/ExpandMore'
|
||||
import { MetalCard, Led } from '@d3ro/ui/components/ds'
|
||||
import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius } from '@d3ro/ui/theme'
|
||||
import { useI18n } from '../../i18n'
|
||||
import { useI18n } from '@d3ro/i18n'
|
||||
import { formatDuration } from '../../utils/formatters'
|
||||
import type { HistoryEntry, MemoTag, MeetingSummaryResult } from '@d3ro/core/types'
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue