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

@ -5,12 +5,23 @@
import { useState, useEffect, useMemo, useRef } from 'react'
import { ThemeProvider, CssBaseline, useMediaQuery } from '@mui/material'
import { getTheme } from '@d3ro/ui/theme'
import { I18nProvider } from './i18n'
import { I18nProvider, type I18nStorage, type Locale } from '@d3ro/i18n'
import { AppLayout } from './components/AppLayout'
import { UpgradePromptModal } from './components/UpgradePromptModal'
import { startSystemAudioCapture, stopSystemAudioCapture } from './utils/systemAudioCapture'
import type { ThemeMode, ConfigChangedEvent } from '@d3ro/core/types'
// Electron ConfigService에 바인딩된 i18n 영속화 어댑터
const electronI18nStorage: I18nStorage = {
load: async () => {
const result = await window.electronAPI.config.get({ key: 'language' })
return result.success && result.data ? (result.data as string) : null
},
save: (locale: Locale) => {
window.electronAPI.config.set({ key: 'language', value: locale })
}
}
export function App(): React.ReactElement {
const [themeMode, setThemeMode] = useState<ThemeMode>('auto')
const prefersDark = useMediaQuery('(prefers-color-scheme: dark)')
@ -60,7 +71,7 @@ export function App(): React.ReactElement {
const theme = useMemo(() => getTheme(themeMode, prefersDark), [themeMode, prefersDark])
return (
<I18nProvider>
<I18nProvider storage={electronI18nStorage}>
<ThemeProvider theme={theme}>
<CssBaseline />
<AppLayout />

View file

@ -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'

View file

@ -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,

View file

@ -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) ──────────────────────────────

View file

@ -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 {

View file

@ -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,

View file

@ -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

View file

@ -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 {

View file

@ -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 {

View file

@ -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'

View file

@ -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 {

View file

@ -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 {

View file

@ -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 {

View file

@ -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

View file

@ -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 {

View file

@ -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 = [

View file

@ -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 {

View file

@ -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

View file

@ -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 {

View file

@ -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,

View file

@ -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'

View file

@ -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'

View file

@ -1,282 +0,0 @@
{
"app.name": "D3RO Voice",
"app.tagline": "Lokaler KI-Sprachassistent",
"nav.dashboard": "Dashboard",
"nav.history": "Verlauf",
"nav.dictionary": "Wörterbuch",
"nav.commands": "Befehle",
"nav.settings": "Einstellungen",
"dashboard.sessionOverview": "Sitzungsübersicht",
"dashboard.systemStatus": "Systemstatus",
"dashboard.sessionsToday": "Sitzungen heute",
"dashboard.pressToRecord": "Drücke {{key}}, um die Aufnahme zu starten",
"dashboard.hotkeyNotSet": "Tastenkürzel nicht festgelegt",
"dashboard.words": "Wörter",
"dashboard.total": "gesamt",
"dashboard.streak": "Serie",
"dashboard.days": "Tage",
"dashboard.recording": "Aufnahme",
"dashboard.sessions": "Sitzungen",
"dashboard.today": "heute",
"dashboard.recentTranscriptions": "Letzte Transkriptionen",
"dashboard.noHistory": "Kein Verlauf — drücke das Tastenkürzel, um die Aufnahme zu starten",
"dashboard.copy": "Kopieren",
"dashboard.entries": "{{count}} Einträge",
"dashboard.stat": "Statistiken",
"dashboard.sys": "System",
"history.title": "Transkriptionsverlauf",
"history.search": "Suchen...",
"history.entries": "{{count}} Einträge",
"history.loading": "Laden...",
"history.noResults": "Keine Ergebnisse",
"history.noHistory": "Kein Verlauf — starte eine Aufnahme",
"history.count": "{{count}} Einträge",
"dictionary.title": "Benutzerwörterbuch",
"dictionary.words": "{{count}} Wörter",
"dictionary.add": "Hinzufügen",
"dictionary.search": "Suchen...",
"dictionary.loading": "Laden...",
"dictionary.noResults": "Keine Ergebnisse",
"dictionary.noWords": "Keine Wörter — füge benutzerdefinierte Wörter hinzu, um die STT-Genauigkeit zu verbessern",
"dictionary.used": "{{count}} Mal verwendet",
"dictionary.editTitle": "Wort bearbeiten",
"dictionary.addTitle": "Wort hinzufügen",
"dictionary.word": "Wort",
"dictionary.pronunciation": "Aussprache (optional)",
"commands.title": "LLM-Befehle",
"commands.count": "{{count}} Befehle",
"commands.add": "Hinzufügen",
"commands.activeCommand": "Aktiver Befehl",
"commands.none": "Keiner",
"commands.loading": "Laden...",
"commands.noCommands": "Keine Befehle — klicke auf Hinzufügen, um einen zu erstellen",
"commands.editTitle": "Befehl bearbeiten",
"commands.addTitle": "Befehl hinzufügen",
"commands.name": "Name",
"commands.description": "Beschreibung",
"commands.promptTemplate": "Prompt-Vorlage",
"commands.promptHelp": "{{text}} wird durch den transkribierten Text ersetzt",
"commands.defaultPrompt": "Bitte verbessere {{text}}.",
"settings.title": "Einstellungen",
"settings.tabs.general": "Allgemein",
"settings.tabs.audio": "Audio",
"settings.tabs.stt": "STT",
"settings.tabs.llm": "LLM",
"settings.tabs.about": "Über",
"settings.shortcuts": "Tastenkürzel",
"settings.dictation": "Diktat",
"settings.dictation.desc": "Gedrückt halten zum Sprechen. Die Transkription beginnt beim Loslassen.",
"settings.agent": "Agentenmodus",
"settings.agent.descWithKey": "Doppelklick auf {{key}}, um den Agentenmodus aufzurufen.",
"settings.agent.descNoKey": "Lege zuerst das Diktat-Tastenkürzel fest.",
"settings.oneTouch": "Ein-Tasten-Modus",
"settings.oneTouch.desc": "Drücken zum Starten, erneut drücken zum Beenden. Erfordert ein eigenes Tastenkürzel.",
"settings.key": "Taste",
"settings.notSet": "Nicht festgelegt",
"settings.enabled": "Aktiviert",
"settings.disabled": "Deaktiviert",
"settings.interface": "Oberfläche",
"settings.theme": "Design",
"settings.theme.system": "System",
"settings.theme.light": "Hell",
"settings.theme.dark": "Dunkel",
"settings.language": "Sprache",
"settings.appBehavior": "App-Verhalten",
"settings.closeToTray": "In Systembereich minimieren",
"settings.autoLaunch": "Beim Systemstart automatisch starten",
"settings.autoInsert": "Text nach der Transkription automatisch einfügen",
"settings.soundEffects": "Soundeffekte",
"settings.microphone": "Mikrofon",
"settings.inputDevice": "Eingabegerät",
"settings.deviceDefault": "(Standard)",
"settings.textInsert": "Texteinfügung",
"settings.insertMethod": "Einfügemethode",
"settings.insertClipboard": "Zwischenablage (Ctrl+V)",
"settings.insertKeyboard": "Tastatureingabe",
"settings.whisperModel": "Whisper-Modell",
"settings.model.tiny": "tiny (39 MB, am schnellsten)",
"settings.model.base": "base (74 MB, ausgewogen)",
"settings.model.small": "small (244 MB, gut)",
"settings.model.medium": "medium (769 MB, sehr gut)",
"settings.model.large": "large-v3 (1,5 GB, beste Qualität)",
"settings.sttLanguage": "Erkennungssprache",
"settings.sttLang.auto": "Automatische Erkennung",
"settings.ollamaServer": "Ollama-Server",
"settings.ollamaUrl": "Ollama-Server-URL",
"settings.ollamaHint": "D3RO Voice verbindet sich automatisch, wenn Ollama läuft. Lade Modelle direkt über Ollama herunter (z. B.: ollama pull qwen3:4b).",
"settings.postProcess": "Sprachnachbearbeitung",
"settings.defaultAction": "Standard-Nachbearbeitungsaktion",
"settings.action.none": "Keine (Originaltext unverändert)",
"settings.action.refine": "Verfeinern (Grammatik + Natürlichkeit)",
"settings.action.translate": "Übersetzen",
"settings.action.summarize": "Zusammenfassen",
"settings.action.grammar": "Grammatikkorrektur",
"settings.action.custom": "Benutzerdefinierter Prompt",
"settings.actionHint": "Die gewählte LLM-Nachbearbeitung wird auf den transkribierten Text angewendet, nachdem mit dem Tastenkürzel aufgenommen wurde. Funktioniert nur, wenn Ollama verbunden ist.",
"settings.about.version": "Version",
"settings.about.techStack": "Tech-Stack",
"settings.about.techStackValue": "Electron + React 19 + MUI 7 + TypeScript",
"settings.about.voiceEngine": "Sprach-Engine",
"settings.about.voiceEngineValue": "STT: faster-whisper (lokal) / LLM: Ollama (lokal)",
"settings.about.description": "Vollständig lokaler KI-Sprachassistent, basierend auf Reverse Engineering von Speakly. Funktioniert ohne Cloud-Abhängigkeiten.",
"settings.about.restartOnboarding": "Einrichtungsanleitung erneut anzeigen",
"status.ollama": "OLLAMA",
"status.offline": "OFFLINE",
"status.nudge.title": "Ollama läuft nicht",
"status.nudge.desc": "Ollama wird für die LLM-Nachbearbeitung (Übersetzung, Zusammenfassung usw.) benötigt.",
"status.nudge.guide": "Installationsanleitung anzeigen →",
"onboarding.welcome.title": "D3RO-VOICE",
"onboarding.welcome.desc": "Ohne Tippen, per Sprache. Dein lokaler KI-Sprachassistent.",
"onboarding.welcome.start": "Loslegen",
"onboarding.mic.title": "Mikrofon einrichten",
"onboarding.mic.desc": "Wähle das Mikrofon aus, das du verwenden möchtest. Du kannst es später in den Einstellungen ändern.",
"onboarding.hotkey.title": "Tastenkürzel einrichten",
"onboarding.hotkey.desc": "Lege das Diktat-Tastenkürzel fest. Die Aufnahme läuft, solange du die Taste gedrückt hältst.",
"onboarding.hotkey.notSet": "Kein Tastenkürzel festgelegt",
"onboarding.hotkey.change": "Tastenkürzel ändern",
"onboarding.hotkey.set": "Tastenkürzel festlegen",
"onboarding.ollama.title": "Ollama installieren (optional)",
"onboarding.ollama.desc": "Ollama wird für die LLM-Nachbearbeitung wie Übersetzung oder Zusammenfassung benötigt. Die Sprachdiktierung funktioniert ohne Ollama.",
"onboarding.ollama.download": "Ollama herunterladen",
"onboarding.ollama.modelHint": "Lade nach der Installation ein Modell über das Terminal herunter",
"onboarding.done.title": "Einrichtung abgeschlossen!",
"onboarding.done.descWithKey": "Halte {{key}} gedrückt und sprich, um deine Stimme in Text umzuwandeln.",
"onboarding.done.descNoKey": "Lege in den Einstellungen ein Tastenkürzel fest, um mit der Spracheingabe zu beginnen.",
"onboarding.done.start": "Loslegen",
"onboarding.back": "Zurück",
"onboarding.next": "Weiter",
"hotkey.title": "Tastenkürzel einrichten",
"hotkey.dictationTitle": "Diktat-Tastenkürzel einrichten",
"hotkey.oneTouchTitle": "Tastenkürzel für Ein-Tasten-Modus einrichten",
"hotkey.prompt": "Drücke eine Tastenkombination...",
"hotkey.ready": "✓ {{keys}} — drücke Speichern",
"hotkey.noKey": "Bitte gib eine Taste ein",
"hotkey.reserved": "{{keys}} ist ein vom System reserviertes Tastenkürzel",
"hotkey.current": "Aktuell: {{keys}}",
"hotkey.hint": "Gib eine Kombination (z. B. Ctrl+Shift+Q) oder eine einzelne Taste (z. B. F5) ein",
"hotkey.reset": "Erneut eingeben",
"ollama.title": "OLLAMA EINRICHTUNGSANLEITUNG",
"ollama.step1.title": "SCHRITT 1 — Ollama installieren",
"ollama.step1.desc": "Ollama ist ein kostenloses Tool zum lokalen Ausführen von LLMs.",
"ollama.step2.title": "SCHRITT 2 — Modell herunterladen",
"ollama.step2.desc": "Führe den folgenden Befehl im Terminal aus, um das empfohlene Modell herunterzuladen:",
"ollama.step2.alt": "Oder ein größeres Modell: ollama pull qwen3:8b (genauer, langsamer)",
"ollama.step3.title": "SCHRITT 3 — Automatische Verbindung",
"ollama.step3.desc": "D3RO-VOICE erkennt automatisch, wenn Ollama läuft. Wenn die LED in der Statusleiste von Rot auf Grün wechselt, ist alles bereit!",
"service.sttEngine": "STT-ENGINE",
"service.ollamaLlm": "OLLAMA LLM",
"service.hotkeyHook": "TASTENKÜRZEL",
"service.audioInput": "AUDIOEINGABE",
"service.ready": "BEREIT",
"service.connected": "VERBUNDEN",
"service.offline": "OFFLINE",
"service.active": "AKTIV",
"service.standby": "BEREITSCHAFT",
"common.cancel": "Abbrechen",
"common.save": "Speichern",
"common.delete": "Löschen",
"common.add": "Hinzufügen",
"common.edit": "Bearbeiten",
"common.close": "Schließen",
"common.confirm": "Bestätigen",
"common.loading": "Laden...",
"common.copy": "Kopieren",
"common.test": "Testen",
"common.stop": "Stoppen",
"date.today": "Heute",
"date.yesterday": "Gestern",
"settings.theme.nord": "Nord",
"settings.theme.solarized": "Solarized",
"settings.theme.catppuccin": "Catppuccin",
"settings.theme.dracula": "Dracula",
"settings.sttLang.ko": "Koreanisch",
"settings.sttLang.en": "Englisch",
"settings.sttLang.ja": "Japanisch",
"settings.sttLang.zh": "Chinesisch",
"template.outputHelperText": "Verwenden Sie {{Feldname}} für Platzhalter",
"nav.meeting": "Meeting",
"meeting.title": "Meeting-Modus",
"meeting.newMeeting": "Neues Meeting",
"meeting.startRecording": "Aufnahme starten",
"meeting.stopRecording": "Aufnahme beenden",
"meeting.recording": "Aufnahme läuft",
"meeting.processing": "Protokoll wird erstellt...",
"meeting.completed": "Abgeschlossen",
"meeting.error": "Fehler",
"meeting.elapsed": "Vergangen",
"meeting.memoPlaceholder": "Memo eingeben (Enter zum Hinzufügen)",
"meeting.memoAdded": "Memo hinzugefügt",
"meeting.noSessions": "Keine Meeting-Aufnahmen",
"meeting.noSessionsDesc": "Drücke «Neues Meeting», um die Aufnahme zu starten",
"meeting.summary": "Zusammenfassung",
"meeting.decisions": "Beschlüsse",
"meeting.actionItems": "Aufgaben",
"meeting.timeline": "Zeitlinie",
"meeting.transcript": "Rohtranskript",
"meeting.memos": "Memos",
"meeting.exportPdf": "Als PDF exportieren",
"meeting.exportMarkdown": "Als Markdown exportieren",
"meeting.delete": "Löschen",
"meeting.deleteConfirm": "Diesen Meeting-Eintrag löschen?",
"meeting.backToList": "Zurück zur Liste",
"meeting.notificationTitle": "Protokoll fertig",
"meeting.notificationBody": "Das Meeting-Protokoll wurde erstellt.",
"meeting.sessions": "{{count}} Sitzungen",
"meeting.duration": "{{minutes}} Min.",
"meeting.editTitle": "Titel bearbeiten",
"meeting.untitled": "Meeting ohne Titel",
"meeting.processingStep.merging": "Transkript zusammenführen...",
"meeting.processingStep.generating": "Protokoll mit LLM erstellen...",
"meeting.processingStep.parsing": "Protokoll analysieren...",
"meeting.processingStep.saving": "Speichern...",
"meeting.processingStep.notifying": "Benachrichtigung senden...",
"meeting.transcriptTab": "Transkript",
"meeting.addDocument": "Dokument hinzufügen",
"meeting.selectTemplate": "Vorlage auswählen",
"meeting.generate": "Generieren",
"meeting.generating": "Dokument wird generiert...",
"meeting.editMode": "Bearbeiten",
"meeting.previewMode": "Vorschau",
"meeting.modified": "Geändert",
"meeting.originalText": "Original",
"meeting.editedText": "Bearbeitet",
"meeting.exportDocx": "DOCX exportieren",
"meeting.exportTxt": "TXT exportieren",
"meeting.exportFormat": "Exportieren",
"meeting.customPrompt": "Benutzerdefinierter Prompt",
"meeting.templateName": "Vorlagenname",
"meeting.templatePrompt": "KI-Prompt",
"meeting.templateSave": "Vorlage speichern",
"meeting.documentDeleted": "Dokument gelöscht",
"meeting.autoSaved": "Automatisch gespeichert",
"meeting.minutesTemplate": "Besprechungsprotokoll",
"meeting.reportTemplate": "Bericht",
"meeting.ideaNoteTemplate": "Ideennotiz",
"meeting.customTemplate": "Benutzerdefiniert",
"meeting.downloadTranscript": "Transkript herunterladen",
"meeting.polish": "KI Glätten",
"meeting.polishing": "KI glättet Transkript...",
"meeting.polished": "KI Glättung abgeschlossen",
"meeting.mindmapTemplate": "Mindmap",
"meeting.chat": "KI-Chat",
"meeting.chatPlaceholder": "Fragen Sie zum Meeting...",
"meeting.chatSend": "Senden",
"meeting.chatClear": "Chat löschen",
"meeting.copyToClipboard": "In Zwischenablage kopieren",
"meeting.copied": "Kopiert",
"meeting.chatCollapse": "Chat einklappen",
"meeting.chatExpand": "Chat ausklappen",
"meeting.exportMd": "Markdown (.md)",
"meeting.exportPdfFmt": "PDF (.pdf)",
"meeting.polishFailed": "KI-Polierung fehlgeschlagen",
"meeting.viewDetailError": "Meeting-Details konnten nicht geladen werden",
"meeting.startRecordingError": "Aufnahme konnte nicht gestartet werden",
"meeting.diarize": "Sprecher trennen",
"meeting.diarizing": "Sprecher werden identifiziert...",
"meeting.diarizeComplete": "Sprechertrennung abgeschlossen",
"meeting.speaker": "Sprecher",
"settings.hfToken": "HuggingFace Token",
"settings.hfTokenHint": "Ein HuggingFace Token wird für die Sprechertrennung benötigt",
"settings.diarization": "Sprechertrennung",
"settings.diarizationHint": "Sprecher werden nach der Aufnahme automatisch identifiziert"
}

View file

@ -1,483 +0,0 @@
{
"app.name": "D3RO Voice",
"app.tagline": "Local AI Voice Assistant",
"nav.dashboard": "Dashboard",
"nav.history": "History",
"nav.dictionary": "Dictionary",
"nav.commands": "Commands",
"nav.settings": "Settings",
"dashboard.sessionOverview": "Session Overview",
"dashboard.systemStatus": "System Status",
"dashboard.sessionsToday": "Today's Sessions",
"dashboard.pressToRecord": "Press {{key}} to start recording",
"dashboard.hotkeyNotSet": "Hotkey not set",
"dashboard.words": "Words",
"dashboard.total": "Total",
"dashboard.streak": "Streak",
"dashboard.days": "days",
"dashboard.recording": "Recording",
"dashboard.sessions": "Sessions",
"dashboard.today": "Today",
"dashboard.recentTranscriptions": "Recent Transcriptions",
"dashboard.noHistory": "No history — press your hotkey to start recording",
"dashboard.copy": "Copy",
"dashboard.entries": "{{count}} entries",
"dashboard.stat": "Stats",
"dashboard.sys": "System",
"history.title": "Transcription History",
"history.search": "Search...",
"history.entries": "{{count}} entries",
"history.loading": "Loading...",
"history.noResults": "No results found",
"history.noHistory": "No history — start recording",
"history.count": "{{count}} entries",
"dictionary.title": "Custom Dictionary",
"dictionary.words": "{{count}} words",
"dictionary.add": "Add",
"dictionary.search": "Search...",
"dictionary.loading": "Loading...",
"dictionary.noResults": "No results found",
"dictionary.noWords": "No words — add custom words to improve STT accuracy",
"dictionary.used": "Used {{count}} times",
"dictionary.editTitle": "Edit Word",
"dictionary.addTitle": "Add Word",
"dictionary.word": "Word",
"dictionary.pronunciation": "Pronunciation (optional)",
"commands.title": "LLM Commands",
"commands.count": "{{count}} commands",
"commands.add": "Add",
"commands.activeCommand": "Active Command",
"commands.none": "None",
"commands.loading": "Loading...",
"commands.noCommands": "No commands — click Add to create one",
"commands.editTitle": "Edit Command",
"commands.addTitle": "Add Command",
"commands.name": "Name",
"commands.description": "Description",
"commands.promptTemplate": "Prompt Template",
"commands.promptHelp": "{{text}} will be replaced with the transcribed text",
"commands.defaultPrompt": "Please refine the following: {{text}}",
"settings.title": "Settings",
"settings.tabs.general": "General",
"settings.tabs.audio": "Audio",
"settings.tabs.stt": "STT",
"settings.tabs.llm": "LLM",
"settings.tabs.about": "About",
"settings.shortcuts": "Shortcuts",
"settings.dictation": "Dictation",
"settings.dictation.desc": "Hold to speak. Transcription begins when you release the key.",
"settings.agent": "Agent Mode",
"settings.agent.descWithKey": "Double-press {{key}} to enter Agent mode.",
"settings.agent.descNoKey": "Set a dictation hotkey first.",
"settings.oneTouch": "One-Touch Mode",
"settings.oneTouch.desc": "Press to start, press again to stop. Requires a separate shortcut.",
"settings.caption": "Live Caption",
"settings.caption.desc": "Toggle live caption mode with hotkey. Transcribes microphone input in real-time.",
"settings.captionAudio": "Caption Audio Source",
"settings.captionSource": "Audio Source",
"settings.captionSource.mic": "Microphone only",
"settings.captionSource.system": "System audio only (desktop sound)",
"settings.captionSource.both": "Microphone + System audio",
"settings.key": "Key",
"settings.notSet": "Not set",
"settings.enabled": "Enabled",
"settings.disabled": "Disabled",
"settings.interface": "Interface",
"settings.theme": "Theme",
"settings.theme.system": "System",
"settings.theme.light": "Light",
"settings.theme.dark": "Dark",
"settings.language": "Language",
"settings.appBehavior": "App Behavior",
"settings.closeToTray": "Minimize to tray on close",
"settings.autoLaunch": "Launch at system startup",
"settings.autoInsert": "Auto-insert text after transcription",
"settings.soundEffects": "Sound Effects",
"settings.microphone": "Microphone",
"settings.inputDevice": "Input Device",
"settings.deviceDefault": "(Default)",
"settings.textInsert": "Text Insertion",
"settings.insertMethod": "Insert Method",
"settings.insertClipboard": "Clipboard (Ctrl+V)",
"settings.insertKeyboard": "Keyboard Typing",
"settings.whisperModel": "Whisper Model",
"settings.model.tiny": "tiny (39 MB, fastest)",
"settings.model.base": "base (74 MB, balanced)",
"settings.model.small": "small (244 MB, good)",
"settings.model.medium": "medium (769 MB, great)",
"settings.model.large": "large-v3 (1.5 GB, best)",
"settings.sttLanguage": "Recognition Language",
"settings.sttLang.auto": "Auto-detect",
"settings.ollamaServer": "Ollama Server",
"settings.ollamaUrl": "Ollama Server URL",
"settings.ollamaHint": "Connects automatically when Ollama is running. Pull models directly in Ollama (e.g. ollama pull qwen3:4b).",
"settings.llmModel": "LLM Model",
"settings.postProcess": "Voice Post-Processing",
"settings.defaultAction": "Default Post-Processing Command",
"settings.action.none": "None (raw transcription)",
"settings.action.refine": "Refine (grammar + fluency)",
"settings.action.translate": "Translate",
"settings.action.summarize": "Summarize",
"settings.action.grammar": "Grammar Correction",
"settings.action.custom": "Custom Prompt",
"settings.actionHint": "The selected LLM post-processing will be applied to your transcription after recording. Only works when Ollama is connected.",
"settings.about.version": "Version",
"settings.about.techStack": "Tech Stack",
"settings.about.techStackValue": "Electron + React 19 + MUI 7 + TypeScript",
"settings.about.voiceEngine": "Voice Engine",
"settings.about.voiceEngineValue": "STT: faster-whisper (local) / LLM: Ollama (local)",
"settings.about.description": "A fully local AI voice assistant built on Speakly reverse-engineering insights. Runs entirely offline with no cloud dependencies.",
"settings.about.restartOnboarding": "Restart Setup Wizard",
"status.ollama": "OLLAMA",
"status.offline": "OFFLINE",
"status.nudge.title": "Ollama is not running",
"status.nudge.desc": "Ollama is required for LLM post-processing (translation, summarization, etc.).",
"status.nudge.guide": "View setup guide →",
"onboarding.welcome.title": "D3RO-VOICE",
"onboarding.welcome.desc": "No typing needed — just speak. Your local AI voice assistant.",
"onboarding.welcome.start": "Get Started",
"onboarding.mic.title": "Microphone Setup",
"onboarding.mic.desc": "Choose a microphone to use. You can change this later in Settings.",
"onboarding.hotkey.title": "Shortcut Setup",
"onboarding.hotkey.desc": "Set your dictation shortcut. Hold the key while speaking to record.",
"onboarding.hotkey.notSet": "No shortcut set",
"onboarding.hotkey.change": "Change Shortcut",
"onboarding.hotkey.set": "Set Shortcut",
"onboarding.ollama.title": "Install Ollama (Optional)",
"onboarding.ollama.desc": "Ollama is required for LLM post-processing like translation and summarization. Voice dictation works without it.",
"onboarding.ollama.download": "Download Ollama",
"onboarding.ollama.modelHint": "After installation, download a model from your terminal",
"onboarding.done.title": "You're all set!",
"onboarding.done.descWithKey": "Hold {{key}} and speak — your voice will be converted to text.",
"onboarding.done.descNoKey": "Set a shortcut in Settings to start voice dictation.",
"onboarding.done.start": "Start Using",
"onboarding.back": "Back",
"onboarding.next": "Next",
"hotkey.title": "Set Shortcut",
"hotkey.dictationTitle": "Set Dictation Shortcut",
"hotkey.oneTouchTitle": "Set One-Touch Mode Shortcut",
"hotkey.captionTitle": "Set Live Caption Shortcut",
"hotkey.prompt": "Press a key combination...",
"hotkey.ready": "✓ {{keys}} — press Save to confirm",
"hotkey.noKey": "Please press a key",
"hotkey.reserved": "{{keys}} is a reserved system shortcut",
"hotkey.current": "Current: {{keys}}",
"hotkey.hint": "Enter a combination (e.g. Ctrl+Shift+Q) or a single key (e.g. F5)",
"hotkey.reset": "Clear",
"ollama.title": "OLLAMA SETUP GUIDE",
"ollama.step1.title": "STEP 1 — Install Ollama",
"ollama.step1.desc": "Ollama is a free tool for running LLMs locally.",
"ollama.step2.title": "STEP 2 — Download a Model",
"ollama.step2.desc": "Pull a model from your terminal. Recommended:",
"ollama.step2.alt": "Or a larger model: ollama pull qwen3:8b (more accurate, slower)",
"ollama.step3.title": "STEP 3 — Auto-Connect",
"ollama.step3.desc": "Once Ollama is running, D3RO-VOICE will detect it automatically. When the status bar LED turns from red to green, you're ready!",
"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": "Cancel",
"common.save": "Save",
"common.delete": "Delete",
"common.add": "Add",
"common.edit": "Edit",
"common.close": "Close",
"common.confirm": "Confirm",
"common.loading": "Loading...",
"common.copy": "Copy",
"common.test": "Test",
"common.stop": "Stop",
"memo.tags": "Tags",
"memo.addTag": "Add Tag",
"memo.removeTag": "Remove Tag",
"memo.tagPlaceholder": "Type a tag and press Enter",
"memo.noTags": "No tags",
"memo.export": "Export as Markdown",
"memo.exportSuccess": "Export complete",
"memo.filterByTag": "Filter by tag",
"memo.allTags": "All Tags",
"memo.clearFilter": "Clear filter",
"voiceCommand.title": "Voice Commands",
"voiceCommand.enabled": "Voice Keyword Recognition",
"voiceCommand.enabledDesc": "Detects keywords at the start of transcription to auto-select commands.",
"voiceCommand.keywords": "Keywords",
"voiceCommand.keywordPlaceholder": "Type keyword and press Enter",
"voiceCommand.noKeywords": "No keywords",
"voiceCommand.matchMode": "Match Mode",
"voiceCommand.matchMode.prefix": "Starts with",
"voiceCommand.matchMode.suffix": "Ends with",
"voiceCommand.matchMode.contains": "Contains",
"chain.title": "LLM Chains",
"chain.count": "{{count}} chains",
"chain.add": "Add Chain",
"chain.editTitle": "Edit Chain",
"chain.addTitle": "Add Chain",
"chain.name": "Chain Name",
"chain.steps": "Steps",
"chain.addStep": "Add Step",
"chain.removeStep": "Remove",
"chain.inputSource": "Input Source",
"chain.inputSource.original": "Original Text",
"chain.inputSource.previous": "Previous Step Result",
"chain.selectInstruction": "Select Command",
"chain.execute": "Execute",
"chain.executing": "Executing...",
"chain.noChains": "No chains — create a pipeline to run multiple commands in sequence",
"chain.step": "Step {{n}}",
"chain.progress": "Processing step {{current}}/{{total}}",
"context.title": "Screen Context",
"context.enabled": "Screen Context",
"context.enabledDesc": "Captures active app and selected text when recording starts, and sends it to the LLM.",
"dashboard.caption": "Live Caption",
"dashboard.captionStart": "Start Caption",
"dashboard.captionStop": "Stop Caption",
"dashboard.captionActive": "Caption Active",
"settings.voiceCommands": "Voice Commands",
"settings.voiceCommands.desc": "Detects keywords in transcription to auto-select commands.",
"settings.screenContext": "Screen Context",
"settings.screenContext.desc": "Sends active app info and selected text to the LLM during recording.",
"date.today": "Today",
"date.yesterday": "Yesterday",
"license.title": "License",
"license.currentTier": "Current Tier",
"license.free": "FREE",
"license.pro": "PRO",
"license.proPlus": "PRO+",
"license.activate": "Activate License",
"license.deactivate": "Deactivate",
"license.keyPlaceholder": "Enter license key...",
"license.activating": "Activating...",
"license.activated": "Activated",
"license.activateError": "Activation failed: {{message}}",
"license.deactivated": "Deactivated",
"license.machineId": "Machine ID",
"license.activatedAt": "Activated At",
"license.manageLicense": "Manage License",
"license.upgrade": "Upgrade",
"license.upgradeTitle": "Upgrade to Pro",
"license.upgradeDesc": "Unlock all features",
"license.quotaUsed": "{{used}}/{{limit}} used",
"license.quotaUnlimited": "Unlimited",
"license.tierComparison": "Tier Comparison",
"license.dailyUsage": "Daily Usage",
"license.feature.dictation": "Dictation",
"license.feature.llm_process": "LLM Processing",
"license.feature.live_caption": "Live Caption",
"license.feature.screen_context": "Screen Context",
"license.feature.voice_command": "Voice Commands",
"license.feature.llm_chain": "LLM Chain",
"license.feature.voice_memo": "Voice Memo",
"license.feature.history_unlimited": "Unlimited History",
"license.feature.history_export": "History Export",
"license.feature.custom_instruction_create": "Custom Instruction",
"license.feature.file_transcription": "File Transcription",
"license.feature.voice_conversation": "Voice Conversation",
"license.feature.dictation_template": "Dictation Template",
"license.feature.meeting_summary": "Meeting Summary",
"license.feature.local_rag": "Local RAG",
"license.feature.os_automation": "OS Automation",
"license.feature.llmProcess": "LLM Processing",
"license.feature.liveCaption": "Live Caption",
"license.feature.screenContext": "Screen Context",
"license.feature.voiceCommand": "Voice Commands",
"license.feature.llmChain": "LLM Chain",
"license.feature.voiceMemo": "Voice Memo",
"license.feature.historyUnlimited": "Unlimited History",
"license.feature.historyExport": "History Export",
"license.feature.customInstruction": "Custom Instruction",
"license.feature.fileTranscription": "File Transcription",
"license.feature.voiceConversation": "Voice Conversation",
"license.feature.dictationTemplate": "Dictation Template",
"license.feature.meetingSummary": "Meeting Summary",
"license.feature.localRag": "Local RAG",
"license.feature.osAutomation": "OS Automation",
"license.pro.required": "PRO Required",
"license.proPlus.required": "PRO+ Required",
"license.included": "Included",
"license.notIncluded": "Not included",
"license.keyLabel": "License Key",
"license.quotaExceeded.title": "You've used all your daily {{feature}}",
"license.quotaExceeded.desc": "Upgrade to Pro for unlimited usage",
"license.tierRequired.title": "{{feature}} is a {{tier}} feature",
"license.tierRequired.desc": "Upgrade to {{tier}} to unlock",
"license.tryTomorrow": "Try again tomorrow",
"license.learnMore": "Learn more",
"license.upgradeBenefits": "Upgrade Benefits",
"license.benefit.unlimitedDictation": "Unlimited dictation",
"license.benefit.unlimitedLLM": "Unlimited AI polish",
"license.benefit.liveCaption": "Live captions",
"license.benefit.unlimitedHistory": "Unlimited history retention",
"license.usageToday": "Usage today",
"license.perDay": "/day",
"license.unlimited": "Unlimited",
"license.locked": "Locked",
"license.nav": "License",
"fileTranscription.title": "File Transcription",
"fileTranscription.dropZone": "Drop audio/video file here",
"fileTranscription.dropZoneHint": "Supports MP3, WAV, M4A, MP4, MKV, WEBM",
"fileTranscription.converting": "Converting...",
"fileTranscription.processing": "Transcribing...",
"fileTranscription.progress": "Chunk {{current}} / {{total}}",
"fileTranscription.complete": "Transcription complete",
"fileTranscription.copyAll": "Copy All",
"fileTranscription.cancel": "Cancel",
"fileTranscription.retry": "Retry",
"fileTranscription.error.invalidFormat": "Unsupported file format",
"fileTranscription.error.unknown": "Unknown error",
"meetingSummary.title": "Meeting Summary",
"meetingSummary.generating": "Generating summary...",
"meetingSummary.summary": "Summary",
"meetingSummary.decisions": "Key Decisions",
"meetingSummary.actionItems": "Action Items",
"meetingSummary.exportMarkdown": "Export as Markdown",
"meetingSummary.noSummary": "No summary available",
"meetingSummary.generate": "Generate Summary",
"template.title": "Dictation Templates",
"template.create": "New Template",
"template.edit": "Edit Template",
"template.delete": "Delete",
"template.name": "Template Name",
"template.description": "Description",
"template.fields": "Fields",
"template.addField": "Add Field",
"template.fieldName": "Field Name",
"template.fieldLabel": "Label",
"template.fieldPrompt": "Voice Prompt",
"template.outputFormat": "Output Format",
"template.startSession": "Start",
"template.cancelSession": "Cancel Session",
"template.empty": "No templates",
"nav.conversation": "Talk",
"conversation.title": "Voice Conversation",
"conversation.idle": "Idle",
"conversation.listening": "Listening",
"conversation.thinking": "Thinking",
"conversation.speaking": "Speaking",
"conversation.empty": "Talk to D3RO",
"conversation.emptyHint": "Press the mic button or type a message",
"conversation.inputPlaceholder": "Type a message...",
"conversation.end": "End",
"conversation.clearHistory": "Clear history",
"nav.knowledge": "Knowledge",
"rag.title": "Knowledge Base",
"rag.addDocument": "Add Document",
"rag.documents": "Documents",
"rag.noDocuments": "No documents",
"rag.chunks": "chunks",
"rag.indexed": "Indexed",
"rag.pending": "Pending",
"rag.indexing": "Indexing",
"rag.reindex": "Reindex",
"rag.askQuestion": "Ask a Question",
"rag.queryPlaceholder": "Ask about your documents...",
"rag.searching": "Searching...",
"rag.sources": "Sources",
"rag.adding": "Adding...",
"rag.parsing": "Parsing document...",
"voiceAction.title": "Voice Actions",
"voiceAction.execute": "Execute",
"voiceAction.presets": "Preset Commands",
"voiceAction.history": "Action History",
"voiceAction.noHistory": "No action history",
"voiceAction.blocked": "Blocked (unsafe)",
"voiceAction.executed": "Executed",
"settings.theme.nord": "Nord",
"settings.theme.solarized": "Solarized",
"settings.theme.catppuccin": "Catppuccin",
"settings.theme.dracula": "Dracula",
"settings.sttLang.ko": "한국어 (Korean)",
"settings.sttLang.en": "English",
"settings.sttLang.ja": "日本語 (Japanese)",
"settings.sttLang.zh": "中文 (Chinese)",
"template.outputHelperText": "Use {{fieldName}} for placeholders",
"nav.meeting": "Meeting",
"meeting.title": "Meeting Mode",
"meeting.newMeeting": "New Meeting",
"meeting.startRecording": "Start Recording",
"meeting.stopRecording": "Stop Recording",
"meeting.recording": "Recording",
"meeting.processing": "Generating minutes...",
"meeting.completed": "Completed",
"meeting.error": "Error",
"meeting.elapsed": "Elapsed",
"meeting.memoPlaceholder": "Type a memo (Enter to add)",
"meeting.memoAdded": "Memo added",
"meeting.noSessions": "No meeting recordings",
"meeting.noSessionsDesc": "Press New Meeting to start recording",
"meeting.summary": "Summary",
"meeting.decisions": "Decisions",
"meeting.actionItems": "Action Items",
"meeting.timeline": "Timeline",
"meeting.transcript": "Raw Transcript",
"meeting.memos": "Memos",
"meeting.exportPdf": "Export PDF",
"meeting.exportMarkdown": "Export Markdown",
"meeting.delete": "Delete",
"meeting.deleteConfirm": "Delete this meeting record?",
"meeting.backToList": "Back to List",
"meeting.notificationTitle": "Minutes Ready",
"meeting.notificationBody": "Meeting minutes have been generated.",
"meeting.sessions": "{{count}} sessions",
"meeting.duration": "{{minutes}} min",
"meeting.editTitle": "Edit Title",
"meeting.untitled": "Untitled Meeting",
"meeting.processingStep.merging": "Merging transcript...",
"meeting.processingStep.generating": "Generating minutes with LLM...",
"meeting.processingStep.parsing": "Parsing minutes...",
"meeting.processingStep.saving": "Saving...",
"meeting.processingStep.notifying": "Sending notification...",
"meeting.transcriptTab": "Transcript",
"meeting.addDocument": "Add Document",
"meeting.selectTemplate": "Select Template",
"meeting.generate": "Generate",
"meeting.generating": "Generating document...",
"meeting.editMode": "Edit",
"meeting.previewMode": "Preview",
"meeting.modified": "Modified",
"meeting.originalText": "Original",
"meeting.editedText": "Edited",
"meeting.exportDocx": "Export DOCX",
"meeting.exportTxt": "Export TXT",
"meeting.exportFormat": "Export",
"meeting.customPrompt": "Custom Prompt",
"meeting.templateName": "Template Name",
"meeting.templatePrompt": "AI Prompt",
"meeting.templateSave": "Save Template",
"meeting.documentDeleted": "Document deleted",
"meeting.autoSaved": "Auto-saved",
"meeting.minutesTemplate": "Meeting Minutes",
"meeting.reportTemplate": "Report",
"meeting.ideaNoteTemplate": "Idea Note",
"meeting.customTemplate": "Custom",
"meeting.downloadTranscript": "Download Transcript",
"meeting.polish": "AI Polish",
"meeting.polishing": "AI is polishing transcript...",
"meeting.polished": "AI Polish complete",
"meeting.mindmapTemplate": "Mind Map",
"meeting.chat": "AI Chat",
"meeting.chatPlaceholder": "Ask about the meeting...",
"meeting.chatSend": "Send",
"meeting.chatClear": "Clear Chat",
"meeting.copyToClipboard": "Copy to Clipboard",
"meeting.copied": "Copied",
"meeting.chatCollapse": "Collapse Chat",
"meeting.chatExpand": "Expand Chat",
"meeting.exportMd": "Markdown (.md)",
"meeting.exportPdfFmt": "PDF (.pdf)",
"meeting.polishFailed": "AI polishing failed",
"meeting.viewDetailError": "Failed to load meeting details",
"meeting.startRecordingError": "Failed to start recording",
"meeting.diarize": "Diarize",
"meeting.diarizing": "Identifying speakers...",
"meeting.diarizeComplete": "Diarization complete",
"meeting.speaker": "Speaker",
"settings.hfToken": "HuggingFace Token",
"settings.hfTokenHint": "A HuggingFace token is required for speaker diarization",
"settings.diarization": "Speaker Diarization",
"settings.diarizationHint": "Automatically identify speakers after recording ends"
}

View file

@ -1,282 +0,0 @@
{
"app.name": "D3RO Voice",
"app.tagline": "Asistente de voz con IA local",
"nav.dashboard": "Panel",
"nav.history": "Historial",
"nav.dictionary": "Diccionario",
"nav.commands": "Comandos",
"nav.settings": "Ajustes",
"dashboard.sessionOverview": "Resumen de sesión",
"dashboard.systemStatus": "Estado del sistema",
"dashboard.sessionsToday": "Sesiones hoy",
"dashboard.pressToRecord": "Pulsa {{key}} para empezar a grabar",
"dashboard.hotkeyNotSet": "Atajo no configurado",
"dashboard.words": "palabras",
"dashboard.total": "total",
"dashboard.streak": "racha",
"dashboard.days": "días",
"dashboard.recording": "grabando",
"dashboard.sessions": "sesiones",
"dashboard.today": "hoy",
"dashboard.recentTranscriptions": "Transcripciones recientes",
"dashboard.noHistory": "Sin historial — pulsa el atajo para empezar a grabar",
"dashboard.copy": "Copiar",
"dashboard.entries": "{{count}} entradas",
"dashboard.stat": "estadísticas",
"dashboard.sys": "sistema",
"history.title": "Historial de transcripciones",
"history.search": "Buscar...",
"history.entries": "{{count}} entradas",
"history.loading": "Cargando...",
"history.noResults": "Sin resultados",
"history.noHistory": "Sin historial — empieza a grabar",
"history.count": "{{count}} entradas",
"dictionary.title": "Diccionario personalizado",
"dictionary.words": "{{count}} palabras",
"dictionary.add": "Añadir",
"dictionary.search": "Buscar...",
"dictionary.loading": "Cargando...",
"dictionary.noResults": "Sin resultados",
"dictionary.noWords": "Sin palabras — añade palabras personalizadas para mejorar la precisión del STT",
"dictionary.used": "usado {{count}} veces",
"dictionary.editTitle": "Editar palabra",
"dictionary.addTitle": "Añadir palabra",
"dictionary.word": "Palabra",
"dictionary.pronunciation": "Pronunciación (opcional)",
"commands.title": "Comandos LLM",
"commands.count": "{{count}} comandos",
"commands.add": "Añadir",
"commands.activeCommand": "Comando activo",
"commands.none": "Ninguno",
"commands.loading": "Cargando...",
"commands.noCommands": "Sin comandos — haz clic en añadir para crear uno",
"commands.editTitle": "Editar comando",
"commands.addTitle": "Añadir comando",
"commands.name": "Nombre",
"commands.description": "Descripción",
"commands.promptTemplate": "Plantilla de prompt",
"commands.promptHelp": "{{text}} se reemplazará por el texto transcrito",
"commands.defaultPrompt": "Por favor, mejora {{text}}.",
"settings.title": "Ajustes",
"settings.tabs.general": "General",
"settings.tabs.audio": "Audio",
"settings.tabs.stt": "STT",
"settings.tabs.llm": "LLM",
"settings.tabs.about": "Acerca de",
"settings.shortcuts": "Atajos",
"settings.dictation": "Dictado",
"settings.dictation.desc": "Mantén pulsado para hablar. Al soltar, comienza la transcripción.",
"settings.agent": "Modo agente",
"settings.agent.descWithKey": "Haz doble clic en {{key}} para entrar en el modo agente.",
"settings.agent.descNoKey": "Primero configura el atajo de dictado.",
"settings.oneTouch": "Modo un toque",
"settings.oneTouch.desc": "Pulsa para iniciar, pulsa de nuevo para detener. Requiere un atajo independiente.",
"settings.key": "Tecla",
"settings.notSet": "No configurado",
"settings.enabled": "Activado",
"settings.disabled": "Desactivado",
"settings.interface": "Interfaz",
"settings.theme": "Tema",
"settings.theme.system": "Sistema",
"settings.theme.light": "Claro",
"settings.theme.dark": "Oscuro",
"settings.language": "Idioma",
"settings.appBehavior": "Comportamiento de la app",
"settings.closeToTray": "Minimizar a la bandeja",
"settings.autoLaunch": "Iniciar con el sistema",
"settings.autoInsert": "Insertar texto automáticamente tras transcripción",
"settings.soundEffects": "Efectos de sonido",
"settings.microphone": "Micrófono",
"settings.inputDevice": "Dispositivo de entrada",
"settings.deviceDefault": "(predeterminado)",
"settings.textInsert": "Inserción de texto",
"settings.insertMethod": "Método de inserción",
"settings.insertClipboard": "Portapapeles (Ctrl+V)",
"settings.insertKeyboard": "Escritura con teclado",
"settings.whisperModel": "Modelo Whisper",
"settings.model.tiny": "tiny (39 MB, más rápido)",
"settings.model.base": "base (74 MB, equilibrado)",
"settings.model.small": "small (244 MB, bueno)",
"settings.model.medium": "medium (769 MB, muy bueno)",
"settings.model.large": "large-v3 (1.5 GB, mejor)",
"settings.sttLanguage": "Idioma de reconocimiento",
"settings.sttLang.auto": "Detección automática",
"settings.ollamaServer": "Servidor Ollama",
"settings.ollamaUrl": "URL del servidor Ollama",
"settings.ollamaHint": "D3RO Voice se conecta automáticamente cuando Ollama está en ejecución. Descarga modelos directamente desde Ollama (ej: ollama pull qwen3:4b).",
"settings.postProcess": "Postprocesado de voz",
"settings.defaultAction": "Acción de postprocesado predeterminada",
"settings.action.none": "Ninguna (texto original sin cambios)",
"settings.action.refine": "Refinar (gramática + naturalidad)",
"settings.action.translate": "Traducir",
"settings.action.summarize": "Resumir",
"settings.action.grammar": "Corrección gramatical",
"settings.action.custom": "Prompt personalizado",
"settings.actionHint": "El postprocesado LLM seleccionado se aplica al texto transcrito tras grabar con el atajo. Solo funciona cuando Ollama está conectado.",
"settings.about.version": "Versión",
"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": "Asistente de voz con IA completamente local, basado en ingeniería inversa de Speakly. Funciona sin dependencias en la nube.",
"settings.about.restartOnboarding": "Ver guía de configuración inicial de nuevo",
"status.ollama": "OLLAMA",
"status.offline": "OFFLINE",
"status.nudge.title": "Ollama no está en ejecución",
"status.nudge.desc": "Se necesita Ollama para el postprocesado LLM (traducción, resumen, etc.).",
"status.nudge.guide": "Ver guía de instalación →",
"onboarding.welcome.title": "D3RO-VOICE",
"onboarding.welcome.desc": "Sin escribir, con voz. Tu asistente de voz con IA local.",
"onboarding.welcome.start": "Comenzar",
"onboarding.mic.title": "Configurar micrófono",
"onboarding.mic.desc": "Selecciona el micrófono que quieres usar. Puedes cambiarlo más tarde en los ajustes.",
"onboarding.hotkey.title": "Configurar atajo",
"onboarding.hotkey.desc": "Configura el atajo de dictado. Se grabará mientras mantengas la tecla pulsada.",
"onboarding.hotkey.notSet": "No se ha configurado ningún atajo",
"onboarding.hotkey.change": "Cambiar atajo",
"onboarding.hotkey.set": "Configurar atajo",
"onboarding.ollama.title": "Instalar Ollama (opcional)",
"onboarding.ollama.desc": "Se necesita Ollama para el postprocesado LLM como traducción o resumen. El dictado de voz funciona sin Ollama.",
"onboarding.ollama.download": "Descargar Ollama",
"onboarding.ollama.modelHint": "Tras instalar, descarga un modelo desde la terminal",
"onboarding.done.title": "¡Configuración completa!",
"onboarding.done.descWithKey": "Mantén pulsado {{key}} y habla para convertir tu voz en texto.",
"onboarding.done.descNoKey": "Configura un atajo en los ajustes para empezar a dictar.",
"onboarding.done.start": "Comenzar",
"onboarding.back": "Atrás",
"onboarding.next": "Siguiente",
"hotkey.title": "Configurar atajo",
"hotkey.dictationTitle": "Configurar atajo de dictado",
"hotkey.oneTouchTitle": "Configurar atajo de modo un toque",
"hotkey.prompt": "Pulsa una combinación de teclas...",
"hotkey.ready": "✓ {{keys}} — pulsa guardar",
"hotkey.noKey": "Por favor, introduce una tecla",
"hotkey.reserved": "{{keys}} es un atajo reservado por el sistema",
"hotkey.current": "Actual: {{keys}}",
"hotkey.hint": "Introduce una combinación (ej: Ctrl+Shift+Q) o una tecla sola (ej: F5)",
"hotkey.reset": "Volver a introducir",
"ollama.title": "GUÍA DE CONFIGURACIÓN DE OLLAMA",
"ollama.step1.title": "PASO 1 — Instalar Ollama",
"ollama.step1.desc": "Ollama es una herramienta gratuita para ejecutar LLMs de forma local.",
"ollama.step2.title": "PASO 2 — Descargar un modelo",
"ollama.step2.desc": "Ejecuta el siguiente comando en la terminal para descargar el modelo recomendado:",
"ollama.step2.alt": "O un modelo más grande: ollama pull qwen3:8b (más preciso, más lento)",
"ollama.step3.title": "PASO 3 — Conexión automática",
"ollama.step3.desc": "D3RO-VOICE detecta automáticamente cuando Ollama está en ejecución. Cuando el LED de la barra de estado pase de rojo a verde, ¡estará listo!",
"service.sttEngine": "MOTOR STT",
"service.ollamaLlm": "OLLAMA LLM",
"service.hotkeyHook": "ATAJO DE TECLADO",
"service.audioInput": "ENTRADA DE AUDIO",
"service.ready": "LISTO",
"service.connected": "CONECTADO",
"service.offline": "OFFLINE",
"service.active": "ACTIVO",
"service.standby": "EN ESPERA",
"common.cancel": "Cancelar",
"common.save": "Guardar",
"common.delete": "Eliminar",
"common.add": "Añadir",
"common.edit": "Editar",
"common.close": "Cerrar",
"common.confirm": "Confirmar",
"common.loading": "Cargando...",
"common.copy": "Copiar",
"common.test": "Probar",
"common.stop": "Detener",
"date.today": "Hoy",
"date.yesterday": "Ayer",
"settings.theme.nord": "Nord",
"settings.theme.solarized": "Solarized",
"settings.theme.catppuccin": "Catppuccin",
"settings.theme.dracula": "Dracula",
"settings.sttLang.ko": "Coreano",
"settings.sttLang.en": "Inglés",
"settings.sttLang.ja": "Japonés",
"settings.sttLang.zh": "Chino",
"template.outputHelperText": "Use {{nombreCampo}} para marcadores de posición",
"nav.meeting": "Reunión",
"meeting.title": "Modo Reunión",
"meeting.newMeeting": "Nueva Reunión",
"meeting.startRecording": "Iniciar Grabación",
"meeting.stopRecording": "Detener Grabación",
"meeting.recording": "Grabando",
"meeting.processing": "Generando actas...",
"meeting.completed": "Completado",
"meeting.error": "Error",
"meeting.elapsed": "Tiempo transcurrido",
"meeting.memoPlaceholder": "Escribe un memo (Enter para añadir)",
"meeting.memoAdded": "Memo añadido",
"meeting.noSessions": "Sin grabaciones de reuniones",
"meeting.noSessionsDesc": "Pulsa Nueva Reunión para empezar a grabar",
"meeting.summary": "Resumen",
"meeting.decisions": "Decisiones",
"meeting.actionItems": "Tareas",
"meeting.timeline": "Línea de tiempo",
"meeting.transcript": "Transcripción bruta",
"meeting.memos": "Memos",
"meeting.exportPdf": "Exportar PDF",
"meeting.exportMarkdown": "Exportar Markdown",
"meeting.delete": "Eliminar",
"meeting.deleteConfirm": "¿Eliminar este registro de reunión?",
"meeting.backToList": "Volver a la lista",
"meeting.notificationTitle": "Actas listas",
"meeting.notificationBody": "Las actas de la reunión han sido generadas.",
"meeting.sessions": "{{count}} sesiones",
"meeting.duration": "{{minutes}} min",
"meeting.editTitle": "Editar título",
"meeting.untitled": "Reunión sin título",
"meeting.processingStep.merging": "Fusionando transcripción...",
"meeting.processingStep.generating": "Generando actas con LLM...",
"meeting.processingStep.parsing": "Analizando actas...",
"meeting.processingStep.saving": "Guardando...",
"meeting.processingStep.notifying": "Enviando notificación...",
"meeting.transcriptTab": "Transcripción",
"meeting.addDocument": "Agregar documento",
"meeting.selectTemplate": "Seleccionar plantilla",
"meeting.generate": "Generar",
"meeting.generating": "Generando documento...",
"meeting.editMode": "Editar",
"meeting.previewMode": "Vista previa",
"meeting.modified": "Modificado",
"meeting.originalText": "Original",
"meeting.editedText": "Editado",
"meeting.exportDocx": "Exportar DOCX",
"meeting.exportTxt": "Exportar TXT",
"meeting.exportFormat": "Exportar",
"meeting.customPrompt": "Prompt personalizado",
"meeting.templateName": "Nombre de plantilla",
"meeting.templatePrompt": "Prompt de IA",
"meeting.templateSave": "Guardar plantilla",
"meeting.documentDeleted": "Documento eliminado",
"meeting.autoSaved": "Guardado automáticamente",
"meeting.minutesTemplate": "Actas de reunión",
"meeting.reportTemplate": "Informe",
"meeting.ideaNoteTemplate": "Nota de ideas",
"meeting.customTemplate": "Personalizado",
"meeting.downloadTranscript": "Descargar transcripción",
"meeting.polish": "Pulir con IA",
"meeting.polishing": "IA puliendo transcripción...",
"meeting.polished": "Pulido con IA completado",
"meeting.mindmapTemplate": "Mapa mental",
"meeting.chat": "Chat IA",
"meeting.chatPlaceholder": "Pregunta sobre la reunión...",
"meeting.chatSend": "Enviar",
"meeting.chatClear": "Limpiar chat",
"meeting.copyToClipboard": "Copiar al portapapeles",
"meeting.copied": "Copiado",
"meeting.chatCollapse": "Contraer chat",
"meeting.chatExpand": "Expandir chat",
"meeting.exportMd": "Markdown (.md)",
"meeting.exportPdfFmt": "PDF (.pdf)",
"meeting.polishFailed": "Error al pulir con IA",
"meeting.viewDetailError": "Error al cargar detalles de la reunión",
"meeting.startRecordingError": "Error al iniciar la grabación",
"meeting.diarize": "Identificar hablantes",
"meeting.diarizing": "Identificando hablantes...",
"meeting.diarizeComplete": "Identificación completada",
"meeting.speaker": "Hablante",
"settings.hfToken": "Token de HuggingFace",
"settings.hfTokenHint": "Se necesita un token de HuggingFace para identificar hablantes",
"settings.diarization": "Identificación de hablantes",
"settings.diarizationHint": "Identifica automáticamente los hablantes al finalizar la grabación"
}

View file

@ -1,282 +0,0 @@
{
"app.name": "D3RO Voice",
"app.tagline": "Assistant vocal IA local",
"nav.dashboard": "Tableau de bord",
"nav.history": "Historique",
"nav.dictionary": "Dictionnaire",
"nav.commands": "Commandes",
"nav.settings": "Paramètres",
"dashboard.sessionOverview": "Aperçu de session",
"dashboard.systemStatus": "État du système",
"dashboard.sessionsToday": "Sessions aujourd'hui",
"dashboard.pressToRecord": "Appuyez sur {{key}} pour commencer l'enregistrement",
"dashboard.hotkeyNotSet": "Raccourci non configuré",
"dashboard.words": "mots",
"dashboard.total": "total",
"dashboard.streak": "série",
"dashboard.days": "jours",
"dashboard.recording": "enregistrement",
"dashboard.sessions": "sessions",
"dashboard.today": "aujourd'hui",
"dashboard.recentTranscriptions": "Transcriptions récentes",
"dashboard.noHistory": "Aucun historique — appuyez sur le raccourci pour commencer à enregistrer",
"dashboard.copy": "Copier",
"dashboard.entries": "{{count}} entrées",
"dashboard.stat": "statistiques",
"dashboard.sys": "système",
"history.title": "Historique des transcriptions",
"history.search": "Rechercher...",
"history.entries": "{{count}} entrées",
"history.loading": "Chargement...",
"history.noResults": "Aucun résultat",
"history.noHistory": "Aucun historique — commencez à enregistrer",
"history.count": "{{count}} entrées",
"dictionary.title": "Dictionnaire personnalisé",
"dictionary.words": "{{count}} mots",
"dictionary.add": "Ajouter",
"dictionary.search": "Rechercher...",
"dictionary.loading": "Chargement...",
"dictionary.noResults": "Aucun résultat",
"dictionary.noWords": "Aucun mot — ajoutez des mots personnalisés pour améliorer la précision du STT",
"dictionary.used": "utilisé {{count}} fois",
"dictionary.editTitle": "Modifier le mot",
"dictionary.addTitle": "Ajouter un mot",
"dictionary.word": "Mot",
"dictionary.pronunciation": "Prononciation (facultatif)",
"commands.title": "Commandes LLM",
"commands.count": "{{count}} commandes",
"commands.add": "Ajouter",
"commands.activeCommand": "Commande active",
"commands.none": "Aucune",
"commands.loading": "Chargement...",
"commands.noCommands": "Aucune commande — cliquez sur ajouter pour en créer une",
"commands.editTitle": "Modifier la commande",
"commands.addTitle": "Ajouter une commande",
"commands.name": "Nom",
"commands.description": "Description",
"commands.promptTemplate": "Modèle de prompt",
"commands.promptHelp": "{{text}} sera remplacé par le texte transcrit",
"commands.defaultPrompt": "Veuillez améliorer {{text}}.",
"settings.title": "Paramètres",
"settings.tabs.general": "Général",
"settings.tabs.audio": "Audio",
"settings.tabs.stt": "STT",
"settings.tabs.llm": "LLM",
"settings.tabs.about": "À propos",
"settings.shortcuts": "Raccourcis",
"settings.dictation": "Dictée",
"settings.dictation.desc": "Maintenez enfoncé pour parler. La transcription démarre au relâchement.",
"settings.agent": "Mode agent",
"settings.agent.descWithKey": "Double-cliquez sur {{key}} pour entrer en mode agent.",
"settings.agent.descNoKey": "Configurez d'abord le raccourci de dictée.",
"settings.oneTouch": "Mode une touche",
"settings.oneTouch.desc": "Appuyez pour démarrer, appuyez à nouveau pour arrêter. Nécessite un raccourci distinct.",
"settings.key": "Touche",
"settings.notSet": "Non configuré",
"settings.enabled": "Activé",
"settings.disabled": "Désactivé",
"settings.interface": "Interface",
"settings.theme": "Thème",
"settings.theme.system": "Système",
"settings.theme.light": "Clair",
"settings.theme.dark": "Sombre",
"settings.language": "Langue",
"settings.appBehavior": "Comportement de l'application",
"settings.closeToTray": "Réduire dans la barre système",
"settings.autoLaunch": "Lancer au démarrage du système",
"settings.autoInsert": "Insérer le texte automatiquement après la transcription",
"settings.soundEffects": "Effets sonores",
"settings.microphone": "Microphone",
"settings.inputDevice": "Périphérique d'entrée",
"settings.deviceDefault": "(par défaut)",
"settings.textInsert": "Insertion de texte",
"settings.insertMethod": "Méthode d'insertion",
"settings.insertClipboard": "Presse-papiers (Ctrl+V)",
"settings.insertKeyboard": "Frappe au clavier",
"settings.whisperModel": "Modèle Whisper",
"settings.model.tiny": "tiny (39 Mo, le plus rapide)",
"settings.model.base": "base (74 Mo, équilibré)",
"settings.model.small": "small (244 Mo, bon)",
"settings.model.medium": "medium (769 Mo, très bon)",
"settings.model.large": "large-v3 (1,5 Go, meilleur)",
"settings.sttLanguage": "Langue de reconnaissance",
"settings.sttLang.auto": "Détection automatique",
"settings.ollamaServer": "Serveur Ollama",
"settings.ollamaUrl": "URL du serveur Ollama",
"settings.ollamaHint": "D3RO Voice se connecte automatiquement quand Ollama est en cours d'exécution. Téléchargez les modèles directement depuis Ollama (ex : ollama pull qwen3:4b).",
"settings.postProcess": "Post-traitement vocal",
"settings.defaultAction": "Action de post-traitement par défaut",
"settings.action.none": "Aucune (texte original inchangé)",
"settings.action.refine": "Affiner (grammaire + naturel)",
"settings.action.translate": "Traduire",
"settings.action.summarize": "Résumer",
"settings.action.grammar": "Correction grammaticale",
"settings.action.custom": "Prompt personnalisé",
"settings.actionHint": "Le post-traitement LLM sélectionné est appliqué au texte transcrit après l'enregistrement avec le raccourci. Ne fonctionne que lorsque Ollama est connecté.",
"settings.about.version": "Version",
"settings.about.techStack": "Stack technologique",
"settings.about.techStackValue": "Electron + React 19 + MUI 7 + TypeScript",
"settings.about.voiceEngine": "Moteur vocal",
"settings.about.voiceEngineValue": "STT : faster-whisper (local) / LLM : Ollama (local)",
"settings.about.description": "Assistant vocal IA entièrement local, basé sur l'ingénierie inverse de Speakly. Fonctionne sans dépendance au cloud.",
"settings.about.restartOnboarding": "Revoir le guide de configuration initiale",
"status.ollama": "OLLAMA",
"status.offline": "HORS LIGNE",
"status.nudge.title": "Ollama n'est pas en cours d'exécution",
"status.nudge.desc": "Ollama est nécessaire pour le post-traitement LLM (traduction, résumé, etc.).",
"status.nudge.guide": "Voir le guide d'installation →",
"onboarding.welcome.title": "D3RO-VOICE",
"onboarding.welcome.desc": "Sans taper, par la voix. Votre assistant vocal IA local.",
"onboarding.welcome.start": "Commencer",
"onboarding.mic.title": "Configuration du microphone",
"onboarding.mic.desc": "Sélectionnez le microphone que vous souhaitez utiliser. Vous pourrez le modifier plus tard dans les paramètres.",
"onboarding.hotkey.title": "Configuration du raccourci",
"onboarding.hotkey.desc": "Configurez le raccourci de dictée. L'enregistrement dure tant que vous maintenez la touche enfoncée.",
"onboarding.hotkey.notSet": "Aucun raccourci configuré",
"onboarding.hotkey.change": "Modifier le raccourci",
"onboarding.hotkey.set": "Configurer le raccourci",
"onboarding.ollama.title": "Installer Ollama (facultatif)",
"onboarding.ollama.desc": "Ollama est nécessaire pour le post-traitement LLM comme la traduction ou le résumé. La dictée vocale fonctionne sans Ollama.",
"onboarding.ollama.download": "Télécharger Ollama",
"onboarding.ollama.modelHint": "Après l'installation, téléchargez un modèle depuis le terminal",
"onboarding.done.title": "Configuration terminée !",
"onboarding.done.descWithKey": "Maintenez {{key}} enfoncé et parlez pour convertir votre voix en texte.",
"onboarding.done.descNoKey": "Configurez un raccourci dans les paramètres pour commencer la dictée.",
"onboarding.done.start": "Commencer",
"onboarding.back": "Retour",
"onboarding.next": "Suivant",
"hotkey.title": "Configurer le raccourci",
"hotkey.dictationTitle": "Configurer le raccourci de dictée",
"hotkey.oneTouchTitle": "Configurer le raccourci du mode une touche",
"hotkey.prompt": "Appuyez sur une combinaison de touches...",
"hotkey.ready": "✓ {{keys}} — appuyez sur enregistrer",
"hotkey.noKey": "Veuillez saisir une touche",
"hotkey.reserved": "{{keys}} est un raccourci réservé par le système",
"hotkey.current": "Actuel : {{keys}}",
"hotkey.hint": "Saisissez une combinaison (ex : Ctrl+Shift+Q) ou une touche seule (ex : F5)",
"hotkey.reset": "Ressaisir",
"ollama.title": "GUIDE DE CONFIGURATION OLLAMA",
"ollama.step1.title": "ÉTAPE 1 — Installer Ollama",
"ollama.step1.desc": "Ollama est un outil gratuit pour exécuter des LLM en local.",
"ollama.step2.title": "ÉTAPE 2 — Télécharger un modèle",
"ollama.step2.desc": "Exécutez la commande suivante dans le terminal pour télécharger le modèle recommandé :",
"ollama.step2.alt": "Ou un modèle plus grand : ollama pull qwen3:8b (plus précis, plus lent)",
"ollama.step3.title": "ÉTAPE 3 — Connexion automatique",
"ollama.step3.desc": "D3RO-VOICE détecte automatiquement quand Ollama est en cours d'exécution. Quand la LED de la barre d'état passe du rouge au vert, c'est prêt !",
"service.sttEngine": "MOTEUR STT",
"service.ollamaLlm": "OLLAMA LLM",
"service.hotkeyHook": "RACCOURCI CLAVIER",
"service.audioInput": "ENTRÉE AUDIO",
"service.ready": "PRÊT",
"service.connected": "CONNECTÉ",
"service.offline": "HORS LIGNE",
"service.active": "ACTIF",
"service.standby": "EN VEILLE",
"common.cancel": "Annuler",
"common.save": "Enregistrer",
"common.delete": "Supprimer",
"common.add": "Ajouter",
"common.edit": "Modifier",
"common.close": "Fermer",
"common.confirm": "Confirmer",
"common.loading": "Chargement...",
"common.copy": "Copier",
"common.test": "Tester",
"common.stop": "Arrêter",
"date.today": "Aujourd'hui",
"date.yesterday": "Hier",
"settings.theme.nord": "Nord",
"settings.theme.solarized": "Solarized",
"settings.theme.catppuccin": "Catppuccin",
"settings.theme.dracula": "Dracula",
"settings.sttLang.ko": "Coréen",
"settings.sttLang.en": "Anglais",
"settings.sttLang.ja": "Japonais",
"settings.sttLang.zh": "Chinois",
"template.outputHelperText": "Utilisez {{nomChamp}} pour les espaces réservés",
"nav.meeting": "Réunion",
"meeting.title": "Mode Réunion",
"meeting.newMeeting": "Nouvelle Réunion",
"meeting.startRecording": "Démarrer l'enregistrement",
"meeting.stopRecording": "Arrêter l'enregistrement",
"meeting.recording": "Enregistrement en cours",
"meeting.processing": "Génération du compte-rendu...",
"meeting.completed": "Terminé",
"meeting.error": "Erreur",
"meeting.elapsed": "Temps écoulé",
"meeting.memoPlaceholder": "Saisir un mémo (Entrée pour ajouter)",
"meeting.memoAdded": "Mémo ajouté",
"meeting.noSessions": "Aucun enregistrement de réunion",
"meeting.noSessionsDesc": "Appuyez sur Nouvelle Réunion pour commencer l'enregistrement",
"meeting.summary": "Résumé",
"meeting.decisions": "Décisions",
"meeting.actionItems": "Actions à mener",
"meeting.timeline": "Chronologie",
"meeting.transcript": "Transcription brute",
"meeting.memos": "Mémos",
"meeting.exportPdf": "Exporter en PDF",
"meeting.exportMarkdown": "Exporter en Markdown",
"meeting.delete": "Supprimer",
"meeting.deleteConfirm": "Supprimer cet enregistrement de réunion ?",
"meeting.backToList": "Retour à la liste",
"meeting.notificationTitle": "Compte-rendu prêt",
"meeting.notificationBody": "Le compte-rendu de la réunion a été généré.",
"meeting.sessions": "{{count}} séances",
"meeting.duration": "{{minutes}} min",
"meeting.editTitle": "Modifier le titre",
"meeting.untitled": "Réunion sans titre",
"meeting.processingStep.merging": "Fusion de la transcription...",
"meeting.processingStep.generating": "Génération du compte-rendu avec LLM...",
"meeting.processingStep.parsing": "Analyse du compte-rendu...",
"meeting.processingStep.saving": "Enregistrement...",
"meeting.processingStep.notifying": "Envoi de la notification...",
"meeting.transcriptTab": "Transcription",
"meeting.addDocument": "Ajouter un document",
"meeting.selectTemplate": "Choisir un modèle",
"meeting.generate": "Générer",
"meeting.generating": "Génération du document...",
"meeting.editMode": "Éditer",
"meeting.previewMode": "Aperçu",
"meeting.modified": "Modifié",
"meeting.originalText": "Original",
"meeting.editedText": "Édité",
"meeting.exportDocx": "Exporter DOCX",
"meeting.exportTxt": "Exporter TXT",
"meeting.exportFormat": "Exporter",
"meeting.customPrompt": "Invite personnalisée",
"meeting.templateName": "Nom du modèle",
"meeting.templatePrompt": "Invite IA",
"meeting.templateSave": "Sauvegarder le modèle",
"meeting.documentDeleted": "Document supprimé",
"meeting.autoSaved": "Sauvegarde automatique",
"meeting.minutesTemplate": "Compte-rendu",
"meeting.reportTemplate": "Rapport",
"meeting.ideaNoteTemplate": "Note d'idées",
"meeting.customTemplate": "Personnalisé",
"meeting.downloadTranscript": "Télécharger la transcription",
"meeting.polish": "Peaufiner avec IA",
"meeting.polishing": "L'IA peaufine la transcription...",
"meeting.polished": "Peaufinement IA terminé",
"meeting.mindmapTemplate": "Carte mentale",
"meeting.chat": "Chat IA",
"meeting.chatPlaceholder": "Posez une question sur la réunion...",
"meeting.chatSend": "Envoyer",
"meeting.chatClear": "Effacer le chat",
"meeting.copyToClipboard": "Copier dans le presse-papiers",
"meeting.copied": "Copié",
"meeting.chatCollapse": "Réduire le chat",
"meeting.chatExpand": "Agrandir le chat",
"meeting.exportMd": "Markdown (.md)",
"meeting.exportPdfFmt": "PDF (.pdf)",
"meeting.polishFailed": "Echec du polish IA",
"meeting.viewDetailError": "Impossible de charger les détails de la réunion",
"meeting.startRecordingError": "Impossible de démarrer l'enregistrement",
"meeting.diarize": "Identifier les locuteurs",
"meeting.diarizing": "Identification des locuteurs...",
"meeting.diarizeComplete": "Identification terminée",
"meeting.speaker": "Locuteur",
"settings.hfToken": "Token HuggingFace",
"settings.hfTokenHint": "Un token HuggingFace est requis pour l'identification des locuteurs",
"settings.diarization": "Identification des locuteurs",
"settings.diarizationHint": "Identifier automatiquement les locuteurs après l'enregistrement"
}

View file

@ -1,204 +0,0 @@
// src/renderer/i18n/index.ts
// SSOT i18n 엔진: 타입 안전 키, React Context, fallback 체인, Intl 포맷팅
// 마스터: ko.json — 모든 키의 단일 소스
import { createContext, useContext, useState, useCallback, useEffect, useMemo } from 'react'
import type { ReactNode } from 'react'
import ko from './ko.json'
import en from './en.json'
import ja from './ja.json'
import zh from './zh.json'
import zhTW from './zh-TW.json'
import es from './es.json'
import fr from './fr.json'
import de from './de.json'
import pt from './pt.json'
import ru from './ru.json'
import vi from './vi.json'
import th from './th.json'
// ── 타입 ────────────────────────────────────────────────
/** 마스터 키에서 자동 추출된 번역 키 유니온 */
export type TranslationKey = keyof typeof ko
/** 지원 로케일 */
export type Locale =
| 'ko' | 'en' | 'ja' | 'zh' | 'zh-TW'
| 'es' | 'fr' | 'de' | 'pt' | 'ru' | 'vi' | 'th'
type Translations = Record<string, string>
// ── 로케일 레지스트리 ───────────────────────────────────
const LOCALE_MAP: Record<Locale, Translations> = {
ko,
en,
ja,
zh,
'zh-TW': zhTW,
es,
fr,
de,
pt,
ru,
vi,
th,
}
/** 언어 선택 UI에 표시할 메타데이터 (각 언어로 된 자국어명) */
export const LOCALE_META: ReadonlyArray<{ code: Locale; nativeName: string; englishName: string }> = [
{ code: 'ko', nativeName: '한국어', englishName: 'Korean' },
{ code: 'en', nativeName: 'English', englishName: 'English' },
{ code: 'ja', nativeName: '日本語', englishName: 'Japanese' },
{ code: 'zh', nativeName: '简体中文', englishName: 'Chinese (Simplified)' },
{ code: 'zh-TW', nativeName: '繁體中文', englishName: 'Chinese (Traditional)' },
{ code: 'es', nativeName: 'Español', englishName: 'Spanish' },
{ code: 'fr', nativeName: 'Français', englishName: 'French' },
{ code: 'de', nativeName: 'Deutsch', englishName: 'German' },
{ code: 'pt', nativeName: 'Português', englishName: 'Portuguese' },
{ code: 'ru', nativeName: 'Русский', englishName: 'Russian' },
{ code: 'vi', nativeName: 'Tiếng Việt', englishName: 'Vietnamese' },
{ code: 'th', nativeName: 'ไทย', englishName: 'Thai' },
]
// ── 번역 함수 ──────────────────────────────────────────
function resolveTranslation(
key: string,
translations: Translations,
params?: Record<string, string | number>,
): string {
// fallback 체인: 현재 로케일 → en → ko → key 자체
let text = translations[key] ?? (en as Translations)[key] ?? (ko as Translations)[key] ?? key
if (params) {
for (const [k, v] of Object.entries(params)) {
text = text.replaceAll(`{{${k}}}`, String(v))
}
}
return text
}
// ── Intl 포맷팅 유틸 ───────────────────────────────────
function toBcp47(locale: Locale): string {
// BCP 47 태그로 변환
const map: Partial<Record<Locale, string>> = {
'zh': 'zh-CN',
'zh-TW': 'zh-TW',
}
return map[locale] ?? locale
}
function createFormatDate(locale: Locale) {
const bcp = toBcp47(locale)
return (date: Date | number, options?: Intl.DateTimeFormatOptions): string => {
const d = typeof date === 'number' ? new Date(date) : date
return new Intl.DateTimeFormat(bcp, options).format(d)
}
}
function createFormatNumber(locale: Locale) {
const bcp = toBcp47(locale)
return (num: number, options?: Intl.NumberFormatOptions): string => {
return new Intl.NumberFormat(bcp, options).format(num)
}
}
function createFormatRelativeDate(locale: Locale, t: TFunction) {
return (ts: number): string => {
const d = new Date(ts)
d.setHours(0, 0, 0, 0)
const today = new Date()
today.setHours(0, 0, 0, 0)
const yesterday = new Date(today)
yesterday.setDate(yesterday.getDate() - 1)
if (d.getTime() === today.getTime()) return t('date.today')
if (d.getTime() === yesterday.getTime()) return t('date.yesterday')
const bcp = toBcp47(locale)
return new Intl.DateTimeFormat(bcp, { month: 'short', day: 'numeric' }).format(d).toUpperCase()
}
}
function createFormatTime(locale: Locale) {
const bcp = toBcp47(locale)
return (ts: number): string => {
return new Intl.DateTimeFormat(bcp, { hour: '2-digit', minute: '2-digit' }).format(new Date(ts))
}
}
// ── t() 함수 타입 ──────────────────────────────────────
export type TFunction = (key: TranslationKey, params?: Record<string, string | number>) => string
// ── React Context ──────────────────────────────────────
export interface I18nContextValue {
locale: Locale
t: TFunction
setLocale: (locale: Locale) => void
/** Intl 기반 날짜 포맷 */
formatDate: (date: Date | number, options?: Intl.DateTimeFormatOptions) => string
/** Intl 기반 숫자 포맷 */
formatNumber: (num: number, options?: Intl.NumberFormatOptions) => string
/** "오늘" / "어제" / "4월 3일" 등 상대 날짜 */
formatRelativeDate: (ts: number) => string
/** 시:분 포맷 */
formatTime: (ts: number) => string
}
const I18nContext = createContext<I18nContextValue | null>(null)
// ── Provider ───────────────────────────────────────────
export interface I18nProviderProps {
initialLocale?: Locale
children: ReactNode
}
export function I18nProvider({ initialLocale = 'ko', children }: I18nProviderProps): React.ReactElement {
const [locale, setLocaleState] = useState<Locale>(initialLocale)
// ConfigService에서 저장된 언어 로드
useEffect(() => {
window.electronAPI.config.get({ key: 'language' }).then((r) => {
if (r.success && r.data && isValidLocale(r.data as string)) {
setLocaleState(r.data as Locale)
}
})
}, [])
const setLocale = useCallback((newLocale: Locale) => {
setLocaleState(newLocale)
// 설정에 저장
window.electronAPI.config.set({ key: 'language', value: newLocale })
}, [])
const value = useMemo((): I18nContextValue => {
const translations = LOCALE_MAP[locale] ?? ko
const t: TFunction = (key, params) => resolveTranslation(key, translations, params)
return {
locale,
t,
setLocale,
formatDate: createFormatDate(locale),
formatNumber: createFormatNumber(locale),
formatRelativeDate: createFormatRelativeDate(locale, t),
formatTime: createFormatTime(locale),
}
}, [locale, setLocale])
return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>
}
// ── Hook ───────────────────────────────────────────────
export function useI18n(): I18nContextValue {
const ctx = useContext(I18nContext)
if (!ctx) {
throw new Error('useI18n must be used within <I18nProvider>')
}
return ctx
}
// ── 유틸 ───────────────────────────────────────────────
export function isValidLocale(value: string): value is Locale {
return value in LOCALE_MAP
}

View file

@ -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": "エージェントモード",
"settings.agent.descWithKey": "{{key}} を2回クリックするとエージェントモードに入ります。",
"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": "録音終了後に自動的に話者を識別します"
}

View file

@ -1,483 +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.caption": "실시간 자막",
"settings.caption.desc": "핫키로 자막 모드를 토글합니다. 마이크 입력을 실시간 전사합니다.",
"settings.captionAudio": "자막 오디오 소스",
"settings.captionSource": "오디오 소스",
"settings.captionSource.mic": "마이크만",
"settings.captionSource.system": "시스템 오디오만 (데스크톱 소리)",
"settings.captionSource.both": "마이크 + 시스템 오디오",
"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.llmModel": "LLM 모델",
"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.captionTitle": "실시간 자막 단축키 설정",
"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": "중지",
"memo.tags": "태그",
"memo.addTag": "태그 추가",
"memo.removeTag": "태그 제거",
"memo.tagPlaceholder": "태그 입력 후 Enter",
"memo.noTags": "태그 없음",
"memo.export": "마크다운 내보내기",
"memo.exportSuccess": "내보내기 완료",
"memo.filterByTag": "태그로 필터",
"memo.allTags": "전체 태그",
"memo.clearFilter": "필터 해제",
"voiceCommand.title": "음성 명령어",
"voiceCommand.enabled": "음성 키워드 인식",
"voiceCommand.enabledDesc": "전사 시작 시 키워드를 감지하여 명령어를 자동 선택합니다.",
"voiceCommand.keywords": "키워드",
"voiceCommand.keywordPlaceholder": "키워드 입력 후 Enter",
"voiceCommand.noKeywords": "키워드 없음",
"voiceCommand.matchMode": "매칭 모드",
"voiceCommand.matchMode.prefix": "앞부분 일치",
"voiceCommand.matchMode.suffix": "뒷부분 일치",
"voiceCommand.matchMode.contains": "포함",
"chain.title": "LLM 체인",
"chain.count": "{{count}}개",
"chain.add": "체인 추가",
"chain.editTitle": "체인 편집",
"chain.addTitle": "체인 추가",
"chain.name": "체인 이름",
"chain.steps": "단계",
"chain.addStep": "단계 추가",
"chain.removeStep": "제거",
"chain.inputSource": "입력 소스",
"chain.inputSource.original": "원본 텍스트",
"chain.inputSource.previous": "이전 단계 결과",
"chain.selectInstruction": "명령어 선택",
"chain.execute": "실행",
"chain.executing": "실행 중...",
"chain.noChains": "체인 없음 — 여러 명령어를 순차 실행하는 파이프라인을 만들어 보세요",
"chain.step": "{{n}}단계",
"chain.progress": "{{current}}/{{total}} 단계 처리 중",
"context.title": "화면 컨텍스트",
"context.enabled": "스크린 컨텍스트",
"context.enabledDesc": "녹음 시작 시 활성 앱과 선택된 텍스트를 캡처하여 LLM에 전달합니다.",
"dashboard.caption": "실시간 자막",
"dashboard.captionStart": "자막 시작",
"dashboard.captionStop": "자막 종료",
"dashboard.captionActive": "자막 활성",
"settings.voiceCommands": "음성 명령어",
"settings.voiceCommands.desc": "전사된 텍스트에서 키워드를 감지하여 명령어를 자동 선택합니다.",
"settings.screenContext": "화면 컨텍스트",
"settings.screenContext.desc": "녹음 시 활성 앱 정보와 선택된 텍스트를 LLM에 함께 전달합니다.",
"date.today": "오늘",
"date.yesterday": "어제",
"license.title": "라이선스",
"license.currentTier": "현재 등급",
"license.free": "FREE",
"license.pro": "PRO",
"license.proPlus": "PRO+",
"license.activate": "라이선스 활성화",
"license.deactivate": "비활성화",
"license.keyPlaceholder": "라이선스 키 입력...",
"license.activating": "활성화 중...",
"license.activated": "활성화 완료",
"license.activateError": "활성화 실패: {{message}}",
"license.deactivated": "비활성화 완료",
"license.machineId": "기기 ID",
"license.activatedAt": "활성화 일시",
"license.manageLicense": "라이선스 관리",
"license.upgrade": "업그레이드",
"license.upgradeTitle": "Pro로 업그레이드",
"license.upgradeDesc": "모든 기능을 잠금 해제하세요",
"license.quotaUsed": "{{used}}/{{limit}} 사용",
"license.quotaUnlimited": "무제한",
"license.tierComparison": "등급 비교",
"license.dailyUsage": "일일 사용량",
"license.feature.dictation": "받아쓰기",
"license.feature.llm_process": "LLM 처리",
"license.feature.live_caption": "실시간 자막",
"license.feature.screen_context": "화면 컨텍스트",
"license.feature.voice_command": "음성 명령어",
"license.feature.llm_chain": "LLM 체인",
"license.feature.voice_memo": "음성 메모",
"license.feature.history_unlimited": "무제한 히스토리",
"license.feature.history_export": "히스토리 내보내기",
"license.feature.custom_instruction_create": "커스텀 명령어 생성",
"license.feature.file_transcription": "파일 전사",
"license.feature.voice_conversation": "음성 대화",
"license.feature.dictation_template": "받아쓰기 템플릿",
"license.feature.meeting_summary": "회의 요약",
"license.feature.local_rag": "로컬 RAG",
"license.feature.os_automation": "OS 자동화",
"license.feature.llmProcess": "LLM 처리",
"license.feature.liveCaption": "실시간 자막",
"license.feature.screenContext": "화면 컨텍스트",
"license.feature.voiceCommand": "음성 명령어",
"license.feature.llmChain": "LLM 체인",
"license.feature.voiceMemo": "음성 메모",
"license.feature.historyUnlimited": "무제한 히스토리",
"license.feature.historyExport": "히스토리 내보내기",
"license.feature.customInstruction": "커스텀 명령어 생성",
"license.feature.fileTranscription": "파일 전사",
"license.feature.voiceConversation": "음성 대화",
"license.feature.dictationTemplate": "받아쓰기 템플릿",
"license.feature.meetingSummary": "회의 요약",
"license.feature.localRag": "로컬 RAG",
"license.feature.osAutomation": "OS 자동화",
"license.pro.required": "PRO 필요",
"license.proPlus.required": "PRO+ 필요",
"license.included": "포함",
"license.notIncluded": "미포함",
"license.keyLabel": "라이선스 키",
"license.quotaExceeded.title": "오늘의 {{feature}}을(를) 모두 사용했습니다",
"license.quotaExceeded.desc": "Pro로 업그레이드하면 무제한으로 사용할 수 있습니다",
"license.tierRequired.title": "{{feature}}은(는) {{tier}} 기능입니다",
"license.tierRequired.desc": "{{tier}}로 업그레이드하여 잠금을 해제하세요",
"license.tryTomorrow": "내일 다시 사용하기",
"license.learnMore": "알아보기",
"license.upgradeBenefits": "업그레이드 혜택",
"license.benefit.unlimitedDictation": "무제한 받아쓰기",
"license.benefit.unlimitedLLM": "무제한 AI 다듬기",
"license.benefit.liveCaption": "실시간 자막",
"license.benefit.unlimitedHistory": "히스토리 무제한 보존",
"license.usageToday": "오늘 사용량",
"license.perDay": "회/일",
"license.unlimited": "무제한",
"license.locked": "잠금",
"license.nav": "라이선스",
"fileTranscription.title": "파일 전사",
"fileTranscription.dropZone": "오디오/비디오 파일을 여기에 드래그하세요",
"fileTranscription.dropZoneHint": "MP3, WAV, M4A, MP4, MKV, WEBM 지원",
"fileTranscription.converting": "변환 중...",
"fileTranscription.processing": "전사 중...",
"fileTranscription.progress": "청크 {{current}} / {{total}}",
"fileTranscription.complete": "전사 완료",
"fileTranscription.copyAll": "전체 복사",
"fileTranscription.cancel": "취소",
"fileTranscription.retry": "다시 시도",
"fileTranscription.error.invalidFormat": "지원하지 않는 파일 형식입니다",
"fileTranscription.error.unknown": "알 수 없는 오류",
"meetingSummary.title": "회의록 요약",
"meetingSummary.generating": "요약 생성 중...",
"meetingSummary.summary": "요약",
"meetingSummary.decisions": "핵심 결정사항",
"meetingSummary.actionItems": "할 일 목록",
"meetingSummary.exportMarkdown": "마크다운 내보내기",
"meetingSummary.noSummary": "요약이 없습니다",
"meetingSummary.generate": "요약 생성",
"template.title": "딕테이션 템플릿",
"template.create": "새 템플릿",
"template.edit": "템플릿 편집",
"template.delete": "삭제",
"template.name": "템플릿 이름",
"template.description": "설명",
"template.fields": "필드",
"template.addField": "필드 추가",
"template.fieldName": "필드명",
"template.fieldLabel": "라벨",
"template.fieldPrompt": "음성 안내",
"template.outputFormat": "출력 포맷",
"template.startSession": "시작",
"template.cancelSession": "세션 취소",
"template.empty": "템플릿이 없습니다",
"nav.conversation": "대화",
"conversation.title": "음성 대화",
"conversation.idle": "대기",
"conversation.listening": "듣는 중",
"conversation.thinking": "생각 중",
"conversation.speaking": "말하는 중",
"conversation.empty": "D3RO에게 말을 걸어보세요",
"conversation.emptyHint": "마이크 버튼을 누르거나 텍스트를 입력하세요",
"conversation.inputPlaceholder": "메시지 입력...",
"conversation.end": "종료",
"conversation.clearHistory": "대화 초기화",
"nav.knowledge": "지식 베이스",
"rag.title": "지식 베이스",
"rag.addDocument": "문서 추가",
"rag.documents": "문서",
"rag.noDocuments": "문서가 없습니다",
"rag.chunks": "청크",
"rag.indexed": "인덱싱 완료",
"rag.pending": "대기 중",
"rag.indexing": "인덱싱 중",
"rag.reindex": "재인덱싱",
"rag.askQuestion": "질문하기",
"rag.queryPlaceholder": "문서에 대해 질문하세요...",
"rag.searching": "검색 중...",
"rag.sources": "참조 문서",
"rag.adding": "추가 중...",
"rag.parsing": "문서 분석 중...",
"voiceAction.title": "음성 액션",
"voiceAction.execute": "실행",
"voiceAction.presets": "프리셋 명령",
"voiceAction.history": "실행 이력",
"voiceAction.noHistory": "실행 이력이 없습니다",
"voiceAction.blocked": "차단됨 (위험 명령)",
"voiceAction.executed": "실행됨",
"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": "마크다운 내보내기",
"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": "녹음 종료 후 화자를 자동으로 구분합니다"
}

View file

@ -1,282 +0,0 @@
{
"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",
"settings.theme.nord": "Nord",
"settings.theme.solarized": "Solarized",
"settings.theme.catppuccin": "Catppuccin",
"settings.theme.dracula": "Dracula",
"settings.sttLang.ko": "Coreano",
"settings.sttLang.en": "Inglês",
"settings.sttLang.ja": "Japonês",
"settings.sttLang.zh": "Chinês",
"template.outputHelperText": "Use {{nomeCampo}} para marcadores de posição",
"nav.meeting": "Reunião",
"meeting.title": "Modo Reunião",
"meeting.newMeeting": "Nova Reunião",
"meeting.startRecording": "Iniciar Gravação",
"meeting.stopRecording": "Parar Gravação",
"meeting.recording": "Gravando",
"meeting.processing": "Gerando ata...",
"meeting.completed": "Concluído",
"meeting.error": "Erro",
"meeting.elapsed": "Tempo decorrido",
"meeting.memoPlaceholder": "Digite um memo (Enter para adicionar)",
"meeting.memoAdded": "Memo adicionado",
"meeting.noSessions": "Nenhuma gravação de reunião",
"meeting.noSessionsDesc": "Pressione Nova Reunião para começar a gravar",
"meeting.summary": "Resumo",
"meeting.decisions": "Decisões",
"meeting.actionItems": "Itens de ação",
"meeting.timeline": "Linha do tempo",
"meeting.transcript": "Transcrição bruta",
"meeting.memos": "Memos",
"meeting.exportPdf": "Exportar PDF",
"meeting.exportMarkdown": "Exportar Markdown",
"meeting.delete": "Excluir",
"meeting.deleteConfirm": "Excluir este registro de reunião?",
"meeting.backToList": "Voltar à lista",
"meeting.notificationTitle": "Ata pronta",
"meeting.notificationBody": "A ata da reunião foi gerada.",
"meeting.sessions": "{{count}} sessões",
"meeting.duration": "{{minutes}} min",
"meeting.editTitle": "Editar título",
"meeting.untitled": "Reunião sem título",
"meeting.processingStep.merging": "Mesclando transcrição...",
"meeting.processingStep.generating": "Gerando ata com LLM...",
"meeting.processingStep.parsing": "Analisando ata...",
"meeting.processingStep.saving": "Salvando...",
"meeting.processingStep.notifying": "Enviando notificação...",
"meeting.transcriptTab": "Transcrição",
"meeting.addDocument": "Adicionar documento",
"meeting.selectTemplate": "Selecionar modelo",
"meeting.generate": "Gerar",
"meeting.generating": "Gerando documento...",
"meeting.editMode": "Editar",
"meeting.previewMode": "Visualizar",
"meeting.modified": "Modificado",
"meeting.originalText": "Original",
"meeting.editedText": "Editado",
"meeting.exportDocx": "Exportar DOCX",
"meeting.exportTxt": "Exportar TXT",
"meeting.exportFormat": "Exportar",
"meeting.customPrompt": "Prompt personalizado",
"meeting.templateName": "Nome do modelo",
"meeting.templatePrompt": "Prompt de IA",
"meeting.templateSave": "Salvar modelo",
"meeting.documentDeleted": "Documento excluído",
"meeting.autoSaved": "Salvo automaticamente",
"meeting.minutesTemplate": "Ata de reunião",
"meeting.reportTemplate": "Relatório",
"meeting.ideaNoteTemplate": "Nota de ideias",
"meeting.customTemplate": "Personalizado",
"meeting.downloadTranscript": "Baixar transcrição",
"meeting.polish": "Polir com IA",
"meeting.polishing": "IA está polindo a transcrição...",
"meeting.polished": "Polimento IA concluído",
"meeting.mindmapTemplate": "Mapa mental",
"meeting.chat": "Chat IA",
"meeting.chatPlaceholder": "Pergunte sobre a reunião...",
"meeting.chatSend": "Enviar",
"meeting.chatClear": "Limpar chat",
"meeting.copyToClipboard": "Copiar para área de transferência",
"meeting.copied": "Copiado",
"meeting.chatCollapse": "Recolher chat",
"meeting.chatExpand": "Expandir chat",
"meeting.exportMd": "Markdown (.md)",
"meeting.exportPdfFmt": "PDF (.pdf)",
"meeting.polishFailed": "Falha no polimento de IA",
"meeting.viewDetailError": "Falha ao carregar detalhes da reunião",
"meeting.startRecordingError": "Falha ao iniciar gravação",
"meeting.diarize": "Identificar oradores",
"meeting.diarizing": "Identificando oradores...",
"meeting.diarizeComplete": "Identificação concluída",
"meeting.speaker": "Orador",
"settings.hfToken": "Token do HuggingFace",
"settings.hfTokenHint": "Um token do HuggingFace é necessário para identificar oradores",
"settings.diarization": "Identificação de oradores",
"settings.diarizationHint": "Identifica automaticamente os oradores após o término da gravação"
}

View file

@ -1,282 +0,0 @@
{
"app.name": "D3RO Voice",
"app.tagline": "Локальный голосовой ИИ-ассистент",
"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": "Режим агента",
"settings.agent.descWithKey": "Дважды нажмите {{key}} для перехода в режим агента.",
"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 МБ, самая быстрая)",
"settings.model.base": "base (74 МБ, баланс)",
"settings.model.small": "small (244 МБ, хорошая)",
"settings.model.medium": "medium (769 МБ, отличная)",
"settings.model.large": "large-v3 (1.5 ГБ, лучшая)",
"settings.sttLanguage": "Язык распознавания",
"settings.sttLang.auto": "Автоопределение",
"settings.ollamaServer": "Сервер Ollama",
"settings.ollamaUrl": "URL сервера Ollama",
"settings.ollamaHint": "Если Ollama запущена, подключение произойдёт автоматически. Загружайте модели напрямую через Ollama (например: 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. Работает полностью локально без зависимости от облачных сервисов.",
"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": "Без набора текста — только голос. Локальный голосовой ИИ-ассистент.",
"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. Голосовая диктовка работает и без неё.",
"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": "ШАГ 1 — Установка Ollama",
"ollama.step1.desc": "Ollama — бесплатный инструмент для локального запуска LLM.",
"ollama.step2.title": "ШАГ 2 — Загрузка модели",
"ollama.step2.desc": "Загрузите нужную модель через терминал. Рекомендуется:",
"ollama.step2.alt": "Или более крупная модель: ollama pull qwen3:8b (точнее, медленнее)",
"ollama.step3.title": "ШАГ 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": "Английский",
"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": "ИИ-запрос",
"meeting.templateSave": "Сохранить шаблон",
"meeting.documentDeleted": "Документ удалён",
"meeting.autoSaved": "Автосохранение",
"meeting.minutesTemplate": "Протокол встречи",
"meeting.reportTemplate": "Отчёт",
"meeting.ideaNoteTemplate": "Заметка с идеями",
"meeting.customTemplate": "Пользовательский",
"meeting.downloadTranscript": "Скачать транскрипцию",
"meeting.polish": "Улучшить с ИИ",
"meeting.polishing": "ИИ улучшает транскрипцию...",
"meeting.polished": "Улучшение ИИ завершено",
"meeting.mindmapTemplate": "Карта мыслей",
"meeting.chat": "ИИ Чат",
"meeting.chatPlaceholder": "Задайте вопрос о встрече...",
"meeting.chatSend": "Отправить",
"meeting.chatClear": "Очистить чат",
"meeting.copyToClipboard": "Копировать в буфер обмена",
"meeting.copied": "Скопировано",
"meeting.chatCollapse": "Свернуть чат",
"meeting.chatExpand": "Развернуть чат",
"meeting.exportMd": "Markdown (.md)",
"meeting.exportPdfFmt": "PDF (.pdf)",
"meeting.polishFailed": "Ошибка ИИ-полировки",
"meeting.viewDetailError": "Не удалось загрузить детали встречи",
"meeting.startRecordingError": "Не удалось начать запись",
"meeting.diarize": "Определить говорящих",
"meeting.diarizing": "Определение говорящих...",
"meeting.diarizeComplete": "Определение завершено",
"meeting.speaker": "Говорящий",
"settings.hfToken": "Токен HuggingFace",
"settings.hfTokenHint": "Токен HuggingFace необходим для определения говорящих",
"settings.diarization": "Диаризация",
"settings.diarizationHint": "Автоматически определять говорящих после завершения записи"
}

View file

@ -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": "URL เซิร์ฟเวอร์ Ollama",
"settings.ollamaHint": "หาก Ollama กำลังทำงาน จะเชื่อมต่ออัตโนมัติ ดาวน์โหลดโมเดลโดยตรงจาก Ollama (เช่น: 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": "ผู้ช่วยเสียง AI ในเครื่องที่พัฒนาจากความรู้การวิศวกรรมย้อนกลับ Speakly ทำงานได้อย่างสมบูรณ์ในเครื่องโดยไม่พึ่งพาบริการคลาวด์",
"settings.about.restartOnboarding": "ดูคู่มือการตั้งค่าเริ่มต้นอีกครั้ง",
"status.ollama": "OLLAMA",
"status.offline": "OFFLINE",
"status.nudge.title": "Ollama ยังไม่ได้ทำงาน",
"status.nudge.desc": "ต้องใช้ Ollama สำหรับการประมวลผล LLM (แปล สรุป ฯลฯ)",
"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": "ต้องใช้ Ollama สำหรับการประมวลผล LLM (แปล สรุป ฯลฯ) การบอกเล่าเสียงทำงานได้โดยไม่มี 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": "ขั้นตอนที่ 1 — ติดตั้ง Ollama",
"ollama.step1.desc": "Ollama เป็นเครื่องมือฟรีสำหรับรัน LLM ในเครื่อง",
"ollama.step2.title": "ขั้นตอนที่ 2 — ดาวน์โหลดโมเดล",
"ollama.step2.desc": "ดาวน์โหลดโมเดลที่ต้องการผ่านเทอร์มินัล แนะนำ:",
"ollama.step2.alt": "หรือโมเดลที่ใหญ่กว่า: ollama pull qwen3:8b (แม่นยำกว่า ช้ากว่า)",
"ollama.step3.title": "ขั้นตอนที่ 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": "อังกฤษ",
"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": "ระบุผู้พูดโดยอัตโนมัติหลังจากการบันทึกสิ้นสุด"
}

View file

@ -1,282 +0,0 @@
{
"app.name": "D3RO Voice",
"app.tagline": "Trợ lý giọng nói AI cục bộ",
"nav.dashboard": "Bảng điều khiển",
"nav.history": "Lịch sử",
"nav.dictionary": "Từ điển",
"nav.commands": "Lệnh",
"nav.settings": "Cài đặt",
"dashboard.sessionOverview": "Tổng quan phiên",
"dashboard.systemStatus": "Trạng thái hệ thống",
"dashboard.sessionsToday": "Phiên hôm nay",
"dashboard.pressToRecord": "Nhấn {{key}} để bắt đầu ghi âm",
"dashboard.hotkeyNotSet": "Chưa đặt phím tắt",
"dashboard.words": "Từ",
"dashboard.total": "Tổng",
"dashboard.streak": "Chuỗi",
"dashboard.days": "ngày",
"dashboard.recording": "Đang ghi",
"dashboard.sessions": "Phiên",
"dashboard.today": "Hôm nay",
"dashboard.recentTranscriptions": "Phiên âm gần đây",
"dashboard.noHistory": "Chưa có lịch sử — nhấn phím tắt để bắt đầu ghi âm",
"dashboard.copy": "Sao chép",
"dashboard.entries": "{{count}} mục",
"dashboard.stat": "Thống kê",
"dashboard.sys": "Hệ thống",
"history.title": "Lịch sử phiên âm",
"history.search": "Tìm kiếm...",
"history.entries": "{{count}} mục",
"history.loading": "Đang tải...",
"history.noResults": "Không tìm thấy kết quả",
"history.noHistory": "Chưa có lịch sử — hãy bắt đầu ghi âm",
"history.count": "{{count}} mục",
"dictionary.title": "Từ điển tùy chỉnh",
"dictionary.words": "{{count}} từ",
"dictionary.add": "Thêm",
"dictionary.search": "Tìm kiếm...",
"dictionary.loading": "Đang tải...",
"dictionary.noResults": "Không tìm thấy kết quả",
"dictionary.noWords": "Chưa có từ — thêm từ tùy chỉnh để cải thiện độ chính xác STT",
"dictionary.used": "Đã dùng {{count}} lần",
"dictionary.editTitle": "Chỉnh sửa từ",
"dictionary.addTitle": "Thêm từ",
"dictionary.word": "Từ",
"dictionary.pronunciation": "Phát âm (tùy chọn)",
"commands.title": "Lệnh LLM",
"commands.count": "{{count}} lệnh",
"commands.add": "Thêm",
"commands.activeCommand": "Lệnh đang hoạt động",
"commands.none": "Không có",
"commands.loading": "Đang tải...",
"commands.noCommands": "Chưa có lệnh — nhấn Thêm để tạo",
"commands.editTitle": "Chỉnh sửa lệnh",
"commands.addTitle": "Thêm lệnh",
"commands.name": "Tên",
"commands.description": "Mô tả",
"commands.promptTemplate": "Mẫu prompt",
"commands.promptHelp": "{{text}} sẽ được thay thế bằng văn bản phiên âm",
"commands.defaultPrompt": "Vui lòng cải thiện {{text}}.",
"settings.title": "Cài đặt",
"settings.tabs.general": "Chung",
"settings.tabs.audio": "Âm thanh",
"settings.tabs.stt": "STT",
"settings.tabs.llm": "LLM",
"settings.tabs.about": "Giới thiệu",
"settings.shortcuts": "Phím tắt",
"settings.dictation": "Chính tả",
"settings.dictation.desc": "Giữ phím và nói. Thả phím để bắt đầu phiên âm.",
"settings.agent": "Chế độ Agent",
"settings.agent.descWithKey": "Nhấn đúp {{key}} để vào chế độ Agent.",
"settings.agent.descNoKey": "Vui lòng đặt phím tắt chính tả trước.",
"settings.oneTouch": "Chế độ một chạm",
"settings.oneTouch.desc": "Nhấn để bắt đầu, nhấn lại để dừng. Cần phím tắt riêng.",
"settings.key": "Phím",
"settings.notSet": "Chưa đặt",
"settings.enabled": "Đã bật",
"settings.disabled": "Đã tắt",
"settings.interface": "Giao diện",
"settings.theme": "Giao diện",
"settings.theme.system": "Hệ thống",
"settings.theme.light": "Sáng",
"settings.theme.dark": "Tối",
"settings.language": "Ngôn ngữ",
"settings.appBehavior": "Hành vi ứng dụng",
"settings.closeToTray": "Thu nhỏ xuống khay hệ thống",
"settings.autoLaunch": "Tự động khởi động cùng hệ thống",
"settings.autoInsert": "Tự động chèn văn bản sau khi phiên âm",
"settings.soundEffects": "Hiệu ứng âm thanh",
"settings.microphone": "Micrô",
"settings.inputDevice": "Thiết bị đầu vào",
"settings.deviceDefault": "(Mặc định)",
"settings.textInsert": "Chèn văn bản",
"settings.insertMethod": "Phương thức chèn",
"settings.insertClipboard": "Bộ nhớ tạm (Ctrl+V)",
"settings.insertKeyboard": "Giả lập bàn phím",
"settings.whisperModel": "Mô hình Whisper",
"settings.model.tiny": "tiny (39 MB, nhanh nhất)",
"settings.model.base": "base (74 MB, cân bằng)",
"settings.model.small": "small (244 MB, tốt)",
"settings.model.medium": "medium (769 MB, xuất sắc)",
"settings.model.large": "large-v3 (1.5 GB, tốt nhất)",
"settings.sttLanguage": "Ngôn ngữ nhận dạng",
"settings.sttLang.auto": "Tự động phát hiện",
"settings.ollamaServer": "Máy chủ Ollama",
"settings.ollamaUrl": "URL máy chủ Ollama",
"settings.ollamaHint": "Nếu Ollama đang chạy, kết nối sẽ tự động. Tải mô hình trực tiếp từ Ollama (ví dụ: ollama pull qwen3:4b).",
"settings.postProcess": "Hậu xử lý giọng nói",
"settings.defaultAction": "Lệnh hậu xử lý mặc định",
"settings.action.none": "Không có (văn bản gốc)",
"settings.action.refine": "Cải thiện (ngữ pháp + tự nhiên)",
"settings.action.translate": "Dịch",
"settings.action.summarize": "Tóm tắt",
"settings.action.grammar": "Sửa ngữ pháp",
"settings.action.custom": "Prompt tùy chỉnh",
"settings.actionHint": "Hậu xử lý LLM đã chọn sẽ được áp dụng cho văn bản phiên âm sau khi ghi âm. Chỉ hoạt động khi Ollama được kết nối.",
"settings.about.version": "Phiên bản",
"settings.about.techStack": "Ngăn xếp công nghệ",
"settings.about.techStackValue": "Electron + React 19 + MUI 7 + TypeScript",
"settings.about.voiceEngine": "Bộ máy giọng nói",
"settings.about.voiceEngineValue": "STT: faster-whisper (cục bộ) / LLM: Ollama (cục bộ)",
"settings.about.description": "Trợ lý giọng nói AI cục bộ dựa trên kỹ thuật dịch ngược Speakly. Hoạt động hoàn toàn cục bộ, không phụ thuộc vào dịch vụ đám mây.",
"settings.about.restartOnboarding": "Xem lại hướng dẫn cài đặt ban đầu",
"status.ollama": "OLLAMA",
"status.offline": "OFFLINE",
"status.nudge.title": "Ollama chưa chạy",
"status.nudge.desc": "Cần Ollama để sử dụng hậu xử lý LLM (dịch, tóm tắt, v.v.).",
"status.nudge.guide": "Xem hướng dẫn cài đặt →",
"onboarding.welcome.title": "D3RO-VOICE",
"onboarding.welcome.desc": "Không cần gõ phím — chỉ cần nói. Trợ lý giọng nói AI cục bộ.",
"onboarding.welcome.start": "Bắt đầu",
"onboarding.mic.title": "Cài đặt micrô",
"onboarding.mic.desc": "Chọn micrô bạn muốn dùng. Có thể thay đổi sau trong cài đặt.",
"onboarding.hotkey.title": "Cài đặt phím tắt",
"onboarding.hotkey.desc": "Đặt phím tắt chính tả. Giữ phím trong khi ghi âm.",
"onboarding.hotkey.notSet": "Phím tắt chưa được đặt",
"onboarding.hotkey.change": "Thay đổi phím tắt",
"onboarding.hotkey.set": "Đặt phím tắt",
"onboarding.ollama.title": "Cài đặt Ollama (tùy chọn)",
"onboarding.ollama.desc": "Cần Ollama để sử dụng hậu xử lý LLM (dịch, tóm tắt, v.v.). Chính tả giọng nói vẫn hoạt động mà không cần Ollama.",
"onboarding.ollama.download": "Tải Ollama",
"onboarding.ollama.modelHint": "Sau khi cài đặt, tải mô hình qua terminal",
"onboarding.done.title": "Thiết lập hoàn tất!",
"onboarding.done.descWithKey": "Giữ phím {{key}} và nói — giọng nói sẽ được chuyển thành văn bản.",
"onboarding.done.descNoKey": "Đặt phím tắt trong cài đặt để bắt đầu chính tả giọng nói.",
"onboarding.done.start": "Bắt đầu",
"onboarding.back": "Quay lại",
"onboarding.next": "Tiếp theo",
"hotkey.title": "Cài đặt phím tắt",
"hotkey.dictationTitle": "Đặt phím tắt chính tả",
"hotkey.oneTouchTitle": "Đặt phím tắt chế độ một chạm",
"hotkey.prompt": "Nhấn tổ hợp phím...",
"hotkey.ready": "✓ {{keys}} — hãy nhấn Lưu",
"hotkey.noKey": "Vui lòng nhập phím",
"hotkey.reserved": "{{keys}} là phím tắt hệ thống được dành riêng",
"hotkey.current": "Hiện tại: {{keys}}",
"hotkey.hint": "Nhập tổ hợp phím (ví dụ: Ctrl+Shift+Q) hoặc phím đơn (ví dụ: F5)",
"hotkey.reset": "Nhập lại",
"ollama.title": "OLLAMA SETUP GUIDE",
"ollama.step1.title": "BƯỚC 1 — Cài đặt Ollama",
"ollama.step1.desc": "Ollama là công cụ miễn phí để chạy LLM cục bộ.",
"ollama.step2.title": "BƯỚC 2 — Tải mô hình",
"ollama.step2.desc": "Tải mô hình bạn muốn qua terminal. Khuyến nghị:",
"ollama.step2.alt": "Hoặc mô hình lớn hơn: ollama pull qwen3:8b (chính xác hơn, chậm hơn)",
"ollama.step3.title": "BƯỚC 3 — Tự động kết nối",
"ollama.step3.desc": "Khi Ollama chạy, D3RO-VOICE sẽ tự động phát hiện. Khi đèn LED trên thanh trạng thái chuyển từ đỏ sang xanh — đã sẵn sàng!",
"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": "Hủy",
"common.save": "Lưu",
"common.delete": "Xóa",
"common.add": "Thêm",
"common.edit": "Chỉnh sửa",
"common.close": "Đóng",
"common.confirm": "Xác nhận",
"common.loading": "Đang tải...",
"common.copy": "Sao chép",
"common.test": "Kiểm tra",
"common.stop": "Dừng",
"date.today": "Hôm nay",
"date.yesterday": "Hôm qua",
"settings.theme.nord": "Nord",
"settings.theme.solarized": "Solarized",
"settings.theme.catppuccin": "Catppuccin",
"settings.theme.dracula": "Dracula",
"settings.sttLang.ko": "Tiếng Hàn",
"settings.sttLang.en": "Tiếng Anh",
"settings.sttLang.ja": "Tiếng Nhật",
"settings.sttLang.zh": "Tiếng Trung",
"template.outputHelperText": "Sử dụng {{tênTrường}} cho trình giữ chỗ",
"nav.meeting": "Cuộc họp",
"meeting.title": "Chế độ Cuộc họp",
"meeting.newMeeting": "Cuộc họp mới",
"meeting.startRecording": "Bắt đầu ghi âm",
"meeting.stopRecording": "Dừng ghi âm",
"meeting.recording": "Đang ghi âm",
"meeting.processing": "Đang tạo biên bản...",
"meeting.completed": "Hoàn thành",
"meeting.error": "Lỗi",
"meeting.elapsed": "Thời gian đã qua",
"meeting.memoPlaceholder": "Nhập ghi chú (Enter để thêm)",
"meeting.memoAdded": "Đã thêm ghi chú",
"meeting.noSessions": "Không có bản ghi cuộc họp",
"meeting.noSessionsDesc": "Nhấn «Cuộc họp mới» để bắt đầu ghi âm",
"meeting.summary": "Tóm tắt",
"meeting.decisions": "Quyết định",
"meeting.actionItems": "Hành động cần thực hiện",
"meeting.timeline": "Dòng thời gian",
"meeting.transcript": "Bản ghi thô",
"meeting.memos": "Ghi chú",
"meeting.exportPdf": "Xuất PDF",
"meeting.exportMarkdown": "Xuất Markdown",
"meeting.delete": "Xóa",
"meeting.deleteConfirm": "Xóa bản ghi cuộc họp này?",
"meeting.backToList": "Quay lại danh sách",
"meeting.notificationTitle": "Biên bản đã sẵn sàng",
"meeting.notificationBody": "Biên bản cuộc họp đã được tạo.",
"meeting.sessions": "{{count}} phiên",
"meeting.duration": "{{minutes}} phút",
"meeting.editTitle": "Chỉnh sửa tiêu đề",
"meeting.untitled": "Cuộc họp không có tiêu đề",
"meeting.processingStep.merging": "Đang ghép bản ghi...",
"meeting.processingStep.generating": "Đang tạo biên bản với LLM...",
"meeting.processingStep.parsing": "Đang phân tích biên bản...",
"meeting.processingStep.saving": "Đang lưu...",
"meeting.processingStep.notifying": "Đang gửi thông báo...",
"meeting.transcriptTab": "Bản ghi",
"meeting.addDocument": "Thêm tài liệu",
"meeting.selectTemplate": "Chọn mẫu",
"meeting.generate": "Tạo",
"meeting.generating": "Đang tạo tài liệu...",
"meeting.editMode": "Chỉnh sửa",
"meeting.previewMode": "Xem trước",
"meeting.modified": "Đã chỉnh sửa",
"meeting.originalText": "Bản gốc",
"meeting.editedText": "Đã chỉnh sửa",
"meeting.exportDocx": "Xuất DOCX",
"meeting.exportTxt": "Xuất TXT",
"meeting.exportFormat": "Xuất",
"meeting.customPrompt": "Lệnh tùy chỉnh",
"meeting.templateName": "Tên mẫu",
"meeting.templatePrompt": "Lệnh AI",
"meeting.templateSave": "Lưu mẫu",
"meeting.documentDeleted": "Đã xóa tài liệu",
"meeting.autoSaved": "Đã lưu tự động",
"meeting.minutesTemplate": "Biên bản họp",
"meeting.reportTemplate": "Báo cáo",
"meeting.ideaNoteTemplate": "Ghi chú ý tưởng",
"meeting.customTemplate": "Tùy chỉnh",
"meeting.downloadTranscript": "Tải bản ghi",
"meeting.polish": "Tinh chỉnh bằng AI",
"meeting.polishing": "AI đang tinh chỉnh bản ghi...",
"meeting.polished": "Tinh chỉnh AI hoàn tất",
"meeting.mindmapTemplate": "Sơ đồ tư duy",
"meeting.chat": "Chat AI",
"meeting.chatPlaceholder": "Hỏi về cuộc họp...",
"meeting.chatSend": "Gửi",
"meeting.chatClear": "Xóa chat",
"meeting.copyToClipboard": "Sao chép vào bộ nhớ tạm",
"meeting.copied": "Đã sao chép",
"meeting.chatCollapse": "Thu gọn chat",
"meeting.chatExpand": "Mở rộng chat",
"meeting.exportMd": "Markdown (.md)",
"meeting.exportPdfFmt": "PDF (.pdf)",
"meeting.polishFailed": "AI đánh bóng thất bại",
"meeting.viewDetailError": "Không thể tải chi tiết cuộc họp",
"meeting.startRecordingError": "Không thể bắt đầu ghi âm",
"meeting.diarize": "Phân tách người nói",
"meeting.diarizing": "Đang nhận dạng người nói...",
"meeting.diarizeComplete": "Phân tách người nói hoàn tất",
"meeting.speaker": "Người nói",
"settings.hfToken": "Token HuggingFace",
"settings.hfTokenHint": "Cần token HuggingFace để phân tách người nói",
"settings.diarization": "Phân tách người nói",
"settings.diarizationHint": "Tự động nhận dạng người nói sau khi ghi âm kết thúc"
}

View file

@ -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": "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": "錄音結束後自動識別說話人"
}

View file

@ -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": "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": "录音结束后自动识别说话人"
}

View file

@ -13,7 +13,7 @@ import LinkIcon from '@mui/icons-material/Link'
import { MetalCard, PhosphorText, Led, ScreenPanel } from '@d3ro/ui/components/ds'
import { PageHeader, EmptyStateCard } from '../components/shared'
import { d3roPalette, d3roFontMono, d3roTypo, d3roRadius } from '@d3ro/ui/theme'
import { useI18n } from '../i18n'
import { useI18n } from '@d3ro/i18n'
import { TemplateSection } from '../components/TemplateSection'
import type { VoiceCommandRule, VoiceCommandKeyword, KeywordMatchMode, LLMChain, ChainStep } from '@d3ro/core/types'

View file

@ -7,7 +7,7 @@ import { Box } from '@mui/material'
import { CrtDisplay, InstrumentPanel, Led, MetalCard, PhosphorText, ScreenPanel, ButtonGroup, PhysicalButton } from '@d3ro/ui/components/ds'
import { EmptyStateCard, HistoryEntryCard } from '../components/shared'
import { d3roPalette, d3roTypo } from '@d3ro/ui/theme'
import { useI18n } from '../i18n'
import { useI18n } from '@d3ro/i18n'
import { formatRecordingTime, formatRecordingTimeUnit, formatNumber, getDateKey } from '../utils/formatters'
import { FileDropZone } from '../components/FileDropZone'
import type { StatsSummary, HistoryEntry, HotkeyBinding, CaptionState, LicenseTier, UsageQuota } from '@d3ro/core/types'

View file

@ -9,7 +9,7 @@ import EditIcon from '@mui/icons-material/Edit'
import { MetalCard, PhosphorText } from '@d3ro/ui/components/ds'
import { PageHeader, SearchInput, EmptyStateCard } from '../components/shared'
import { d3roPalette, d3roFontMono, d3roTypo } from '@d3ro/ui/theme'
import { useI18n } from '../i18n'
import { useI18n } from '@d3ro/i18n'
import type { DictionaryEntry, DictionaryPage as DictPageData } from '@d3ro/core/types'
const PAGE_SIZE = 50

View file

@ -7,7 +7,7 @@ import { Box, Chip, IconButton, Tooltip } from '@mui/material'
import FileDownloadIcon from '@mui/icons-material/FileDownload'
import { PhosphorText } from '@d3ro/ui/components/ds'
import { d3roPalette, d3roTypo, d3roFontMono, d3roRadius } from '@d3ro/ui/theme'
import { useI18n } from '../i18n'
import { useI18n } from '@d3ro/i18n'
import { getDateKey } from '../utils/formatters'
import { EmptyStateCard, SearchInput, PageHeader, HistoryEntryCard } from '../components/shared'
import type { HistoryEntry, HistoryPage as HistoryPageData, TagCount } from '@d3ro/core/types'

View file

@ -13,7 +13,7 @@ import DescriptionIcon from '@mui/icons-material/Description'
import { MetalCard, PhosphorText, Led, PhysicalButton, ScreenPanel } from '@d3ro/ui/components/ds'
import { PageHeader, EmptyStateCard } from '../components/shared'
import { d3roPalette, d3roFontMono, d3roTypo } from '@d3ro/ui/theme'
import { useI18n } from '../i18n'
import { useI18n } from '@d3ro/i18n'
import type { RAGDocument, RAGQueryResult, RAGIndexProgress } from '@d3ro/core/types'
export function KnowledgeBasePage(): React.ReactElement {

View file

@ -17,7 +17,7 @@ import { MeetingDetailTabs } from '../components/meeting/MeetingDetailTabs'
import { EditableSegment } from '../components/meeting/EditableSegment'
import { PageHeader, EmptyStateCard } from '../components/shared'
import { d3roPalette, d3roFontMono, d3roTypo } from '@d3ro/ui/theme'
import { useI18n } from '../i18n'
import { useI18n } from '@d3ro/i18n'
import type {
MeetingSessionSummary,
MeetingSessionDetail,

View file

@ -12,7 +12,7 @@ import CancelIcon from '@mui/icons-material/Cancel'
import { MetalCard, PhosphorText, Led, PhysicalButton, ScreenPanel, InstrumentPanel } from '@d3ro/ui/components/ds'
import { PageHeader } from '../components/shared'
import { d3roPalette, d3roFontMono, d3roTypo } from '@d3ro/ui/theme'
import { useI18n } from '../i18n'
import { useI18n } from '@d3ro/i18n'
import type {
ConversationState,
ConversationMessage,