feat(desktop): information architecture overhaul — home, records, meetings first
Wave 2 of the 2026-09-28 design overhaul ("records are the main
character, a quiet instrument"). Decisions: design.md.
- Shell: sidebar with primary Home / Records / Meetings (Ctrl+1..3) and a
secondary "Tools" group; every item is a button with aria-current.
The status bar is removed — its "100% LOCAL PRIVACY · ZERO CLOUD SYNC"
claim contradicted device sync; the sidebar shows only queried state.
- Navigation context (routes, params, back, useRouteRequest) so Home can
open a specific meeting or record.
- Home replaces the dashboard: dictation key, start actions, only real
problems, one-line summary, recent records and meetings, file
transcription, free-tier limits.
- Settings become a full-screen route with vertical tabs (tabs no longer
clip) and a shared row grammar; long-standing bugs fixed: team and
enterprise tiers crashed the license tab (currentTier undefined),
first-run onboarding could not be left, Pro+ saw "upgrade to Pro+".
- Records: date-grouped single list with in-place expansion, search and
tags together, mode/favorite filters, load more past 50, undoable
delete. Meetings: list with search/rename/delete, summary-first detail
(summary | transcript | documents | my notes), notes persisted locally
instead of being lost. Tools pages cleaned up; stale-closure example
chips and a 1550x mouse-distance bug fixed.
- Shared pieces: PageHeader, EmptyStateCard, SearchInput ("/" works),
ConfirmDialog, notify with undo; display-labels maps domain values to
typed i18n keys so missing keys fail to compile.
- Mono font stack falls back to Pretendard for Hangul (Korean labels no
longer render spaced out).
- i18n: new ko/en keys via scripts/i18n-add-keys.mjs (one read-merge-
write so parallel editors cannot clobber locale files).
Some renderer files also carried pre-existing in-flight changes (error
recovery deep links, meeting document hooks); they are included as-is.
This commit is contained in:
parent
ba9ef9741e
commit
f064c93197
96 changed files with 12886 additions and 8924 deletions
|
|
@ -137,8 +137,8 @@
|
|||
"settings.sttProvider.assemblyai": "AssemblyAI Universal-2 (Acoustic AI)",
|
||||
"settings.sttProvider.google": "Google Gemini 2.0 Flash Audio",
|
||||
"settings.sttProvider.custom": "Custom (OpenAI-Compatible)",
|
||||
"settings.sttFallbackToLocal": "Auto Fallback to Local Whisper",
|
||||
"settings.sttFallbackToLocalHint": "Automatically switch to offline local Whisper if cloud STT fails",
|
||||
"settings.sttFallbackToLocal": "Fall back to local Whisper",
|
||||
"settings.sttFallbackToLocalHint": "If cloud recognition fails (offline, quota exceeded, invalid key), the audio is recognized again with Whisper on this PC.",
|
||||
"settings.whisperModel": "Dictation model",
|
||||
"settings.model.tiny": "tiny (39 MB, fastest)",
|
||||
"settings.model.base": "base (74 MB, balanced)",
|
||||
|
|
@ -373,9 +373,9 @@
|
|||
"conversation.inputPlaceholder": "Type a message...",
|
||||
"conversation.end": "End",
|
||||
"conversation.clearHistory": "Clear history",
|
||||
"conversation.recording.hint": "SPEAK NOW · PRESS ⏹ TO SEND",
|
||||
"conversation.recording.hint": "Speak now · press ⏹ to send",
|
||||
"conversation.thinking.placeholder": "Waiting for response…",
|
||||
"conversation.state.recording": "RECORDING",
|
||||
"conversation.state.recording": "Recording",
|
||||
"conversation.error.phase.stt": "Speech Recognition",
|
||||
"conversation.error.phase.llm": "Response",
|
||||
"conversation.error.phase.tts": "Voice Playback",
|
||||
|
|
@ -1686,7 +1686,7 @@
|
|||
"keybinding.disabled.mouseLeft": "Left click is used for every on-screen interaction, so it cannot be bound",
|
||||
"keybinding.warning.mousePassthrough": "Mouse buttons also keep performing their original action",
|
||||
"keybinding.ui.add": "Add",
|
||||
"keybinding.ui.remove": "Remove",
|
||||
"keybinding.ui.remove": "Remove {{keys}}",
|
||||
"keybinding.ui.reset": "Reset to Default",
|
||||
"keybinding.ui.tabRecord": "Press a Key",
|
||||
"keybinding.ui.tabList": "Choose from List",
|
||||
|
|
@ -1781,13 +1781,13 @@
|
|||
"input.suggestion.onScreen": "On screen",
|
||||
"input.suggestion.offScreen": "Hidden",
|
||||
"input.suggestion.generating": "Generating…",
|
||||
"input.kbView.knowledge": "Knowledge base",
|
||||
"input.kbView.knowledge": "Knowledge",
|
||||
"input.kbView.insights": "Input insights",
|
||||
"input.insights.tabs.overview": "Overview",
|
||||
"input.insights.tabs.keyboard": "Keyboard",
|
||||
"input.insights.tabs.mouse": "Mouse",
|
||||
"input.insights.tabs.apps": "Apps",
|
||||
"input.insights.tabs.phrases": "Phrases · suggestions",
|
||||
"input.insights.tabs.phrases": "Phrases & suggestions",
|
||||
"input.insights.chars": "Characters typed",
|
||||
"input.insights.wordChars": "Characters",
|
||||
"input.insights.backspaces": "Backspaces",
|
||||
|
|
@ -1835,7 +1835,7 @@
|
|||
"popup.suggestion.hintGeneratingMore": "More coming… (up to {{max}})",
|
||||
"keybinding.action.suggestionPrev": "Previous suggestion",
|
||||
"keybinding.action.suggestionPrev.desc": "Move to the previous suggestion candidate.",
|
||||
"input.insights.tabs.graph": "Graph",
|
||||
"input.insights.tabs.graph": "Sentence graph",
|
||||
"input.graph.description": "Your sentences are stored as nodes and their relations as edges (what follows what, which share terms) so suggestions can pull personal context. Local only.",
|
||||
"input.graph.nodes": "Sentence nodes",
|
||||
"input.graph.followsEdges": "Follows edges",
|
||||
|
|
@ -1932,5 +1932,620 @@
|
|||
"history.stopAudio": "Stop playback",
|
||||
"history.audioUnavailable": "No recording to play (recordings from another device play once that device has synced)",
|
||||
"cloudSync.audio": "Sync recordings too",
|
||||
"cloudSync.audioDesc": "Uploads recordings so the phone and web can play them. Files over 50 MB stay on this computer."
|
||||
"cloudSync.audioDesc": "Uploads recordings so the phone and web can play them. Files over 50 MB stay on this computer.",
|
||||
"nav.home": "Home",
|
||||
"nav.records": "Records",
|
||||
"nav.tools": "Tools",
|
||||
"nav.aiChat": "AI chat",
|
||||
"nav.support": "Support",
|
||||
"nav.mainLabel": "Main navigation",
|
||||
"nav.shortcutHint": "Ctrl+{{n}}",
|
||||
"shell.localAi.connected": "Local AI connected",
|
||||
"shell.localAi.offline": "Local AI off",
|
||||
"shell.localAi.checking": "Checking local AI",
|
||||
"shell.localAi.setup": "How to turn on",
|
||||
"shell.live.caption": "Captions on",
|
||||
"shell.live.meeting": "Recording meeting",
|
||||
"shell.rewardClaimed": "{{tokens}} cloud polish credits added.",
|
||||
"home.title": "Today",
|
||||
"home.dictationHint": "Hold and speak to dictate; release to insert at the cursor.",
|
||||
"home.dictationUnbound": "No dictation shortcut is set.",
|
||||
"home.setShortcut": "Set shortcut",
|
||||
"home.action.newMeeting": "New meeting",
|
||||
"home.action.captionStart": "Turn on live captions",
|
||||
"home.action.captionStop": "Turn off captions",
|
||||
"home.action.captionStarting": "Starting captions",
|
||||
"home.action.captionBlocked": "While a meeting is recording, the meeting owns captions.",
|
||||
"home.recentRecords": "Recent records",
|
||||
"home.recentMeetings": "Recent meetings",
|
||||
"home.viewAll": "View all",
|
||||
"home.emptyRecords": "No records yet.",
|
||||
"home.emptyMeetings": "No meetings yet.",
|
||||
"home.summary.sessions": "{{count}} today",
|
||||
"home.summary.words": "{{count}} words",
|
||||
"home.summary.minutes": "{{time}} recorded",
|
||||
"home.summary.streak": "{{count}}-day streak",
|
||||
"home.summary.label": "Today's usage",
|
||||
"home.fileTranscription": "Transcribe a file",
|
||||
"home.status.llmOffline": "Local AI (Ollama) is off, so polishing, summaries and minutes are unavailable. Dictation still works.",
|
||||
"home.status.openGuide": "How to turn on",
|
||||
"home.usage.title": "Today's usage",
|
||||
"home.usage.unlimited": "Unlimited",
|
||||
"home.meetingDuration": "{{time}}",
|
||||
"home.meetingInProgress": "In progress",
|
||||
"record.mode.dictation": "Dictation",
|
||||
"record.mode.caption": "Captions",
|
||||
"record.mode.file": "File",
|
||||
"record.mode.command": "Command",
|
||||
"record.mode.translate": "Translation",
|
||||
"record.mode.conversation": "Conversation",
|
||||
"license.feature.premium_llm": "Cloud AI polish",
|
||||
"license.feature.cloud_sync": "Sync across devices",
|
||||
"license.feature.team_workspace": "Team workspace",
|
||||
"license.team": "Team",
|
||||
"license.enterprise": "Enterprise",
|
||||
"common.clear": "Clear",
|
||||
"common.undo": "Undo",
|
||||
"common.deleted": "Deleted.",
|
||||
"common.copied": "Copied.",
|
||||
"voice.error.micOpen": "Couldn't open the microphone. Check the input device in Settings → Audio.",
|
||||
"voice.error.micLost": "The microphone disconnected while recording.",
|
||||
"voice.error.noSpeech": "No speech was heard. Check your microphone input.",
|
||||
"voice.error.tooShort": "Too short to transcribe.",
|
||||
"voice.error.transcription": "Transcription failed. Please try again.",
|
||||
"voice.error.captionActive": "Live captions are on, so dictation can't start.",
|
||||
"voice.error.llmFailed": "AI polishing failed, so nothing was inserted.",
|
||||
"popup.tip.processing": "Transcribing",
|
||||
"popup.tip.waitingEngine": "Preparing speech engine",
|
||||
"popup.tip.inserted": "Inserted",
|
||||
"popup.tip.cancelHint": "Esc to cancel",
|
||||
"popup.tip.recordingLabel": "Recording",
|
||||
"popup.close": "Close",
|
||||
"records.searchPlaceholder": "Search records — text, title, summary",
|
||||
"records.filter.label": "Record filters",
|
||||
"records.filter.all": "All",
|
||||
"records.filter.commandTranslate": "Command · Translation",
|
||||
"records.filter.favorites": "Favorites only",
|
||||
"records.filter.clear": "Clear filters",
|
||||
"records.tags.label": "Tags",
|
||||
"records.tags.showAll": "Show {{count}} more tags",
|
||||
"records.tags.showLess": "Show fewer tags",
|
||||
"records.empty.title": "No records yet",
|
||||
"records.empty.description": "Press your dictation shortcut and speak — what you dictate is saved here by date.",
|
||||
"records.empty.shortcut": "Dictation shortcut",
|
||||
"records.empty.unbound": "No dictation shortcut is set yet.",
|
||||
"records.empty.setShortcut": "Set shortcut",
|
||||
"records.noResults.title": "No results",
|
||||
"records.noResults.description": "Try a different search or filter.",
|
||||
"records.noResults.partial": "Nothing in the {{count}} records loaded so far. You can keep searching older records.",
|
||||
"records.searchOlder": "Search older records",
|
||||
"records.loadMore": "Load more",
|
||||
"records.loadingMore": "Loading",
|
||||
"records.loading": "Loading records",
|
||||
"records.shown": "{{shown}} of {{total}} loaded",
|
||||
"records.loadError.title": "Couldn't load records",
|
||||
"records.loadError.description": "Something went wrong reading the record store. Try again, and restart the app if it keeps happening.",
|
||||
"records.loadMoreError": "Couldn't load more records.",
|
||||
"records.status.cancelled": "Cancelled",
|
||||
"records.status.error": "Error",
|
||||
"records.section.polished": "Polished",
|
||||
"records.section.original": "Original",
|
||||
"records.showOriginal": "Show original",
|
||||
"records.hideOriginal": "Hide original",
|
||||
"records.action.copyOriginal": "Copy original",
|
||||
"records.action.copyFailed": "Couldn't copy. Clipboard access may be blocked.",
|
||||
"records.action.removeTag": "Remove tag #{{tag}}",
|
||||
"records.deleteFailed": "Couldn't delete the record, so it's back in the list. Try again.",
|
||||
"records.favoriteFailed": "Couldn't change the favorite. Try again.",
|
||||
"records.more": "More",
|
||||
"records.clearAllAction": "Delete all records",
|
||||
"records.clearAllTitle": "Delete all records?",
|
||||
"records.clearAllBody": "All {{count}} records will be removed. If device sync is on, they're removed from your other devices too. This can't be undone.",
|
||||
"records.clearAllIgnoresFilter": "This deletes every record, regardless of the current search or filters.",
|
||||
"records.clearAllConfirm": "Delete all",
|
||||
"records.clearAllDone": "Deleted all records.",
|
||||
"records.clearAllFailed": "Couldn't delete all records. Try again.",
|
||||
"records.exportHint": "Saves tagged records to a Markdown file, grouped by tag. If a tag is selected, only that tag is saved.",
|
||||
"records.exportDone": "Saved as Markdown: {{path}}",
|
||||
"records.exportFailed": "Couldn't export. Try again.",
|
||||
"license.section.plan": "Plan",
|
||||
"license.trial.title": "Pro+ trial",
|
||||
"license.trial.remaining": "{{days}} days left. When the trial ends, your plan changes to Free.",
|
||||
"license.action.subscribePro": "Subscribe to Pro",
|
||||
"license.action.subscribeProPlus": "Subscribe to Pro+",
|
||||
"license.action.upgradeProPlus": "Upgrade to Pro+",
|
||||
"license.plan.active": "You're on the {{plan}}.",
|
||||
"license.teamPlan": "Team plan",
|
||||
"license.enterprisePlan": "Enterprise plan",
|
||||
"license.freePlan": "Free plan",
|
||||
"license.key.title": "License key",
|
||||
"license.key.desc": "Paste the offline license key you received (D3RO-LIC-…) and activate it.",
|
||||
"license.key.activate": "Activate",
|
||||
"license.key.deactivate": "Deactivate",
|
||||
"license.key.activated": "License key activated.",
|
||||
"license.key.invalid": "Couldn't verify this license key. Make sure you pasted the whole key exactly as issued.",
|
||||
"license.key.failed": "Couldn't activate: {{error}}",
|
||||
"license.key.deactivated": "License deactivated. Your plan is now Free.",
|
||||
"license.quotaPerDay": "{{limit}} per day",
|
||||
"license.quotaPerWeek": "{{limit}} per week",
|
||||
"cloudSync.account": "Account",
|
||||
"cloudSync.signInDesc": "Sign in with Google or GitHub to start syncing.",
|
||||
"cloudSync.status": "Sync status",
|
||||
"support.title": "Support",
|
||||
"support.tab.faq": "FAQ",
|
||||
"support.tab.contact": "Contact us",
|
||||
"support.faq.search": "Search questions",
|
||||
"support.faq.empty": "No matching questions.",
|
||||
"support.faq.mic.q": "Speech recognition doesn't work or no sound is picked up.",
|
||||
"support.faq.mic.a": "1. In Windows Settings > Privacy & security > Microphone, make sure \"Let desktop apps access your microphone\" is on.\n2. In D3RO Voice Settings > Audio, make sure the microphone you actually use is selected.\n3. If it still doesn't work, email us from the \"Contact us\" tab.",
|
||||
"support.faq.gpu.q": "How do I turn on NVIDIA CUDA GPU acceleration?",
|
||||
"support.faq.gpu.a": "If an NVIDIA graphics card and the CUDA runtime are available, the faster-whisper (CTranslate2) engine detects the GPU and runs in GPU mode. Larger models need more VRAM.",
|
||||
"support.faq.refund.q": "How do I request a refund?",
|
||||
"support.faq.refund.a": "Refunds and cancellations follow the terms shown at purchase and the policy of the payment processor (Google Play, etc.). Refunds are not issued automatically in the app. Email us from the \"Contact us\" tab with the \"Billing / refund\" category and we'll get back to you.",
|
||||
"support.faq.invoice.q": "How do I request a business tax invoice?",
|
||||
"support.faq.invoice.a": "Email us from the \"Contact us\" tab with the \"Billing / refund\" category, including your business details and payment history.",
|
||||
"support.category.audio": "Microphone / audio",
|
||||
"support.category.gpu": "CUDA GPU / model loading errors",
|
||||
"support.category.billing": "Billing / refund",
|
||||
"support.category.general": "Other",
|
||||
"support.contact.intro": "We take questions by email. Fill in the form and press the button to open a draft in your mail app. The question reaches us only after you send it from your mail app.",
|
||||
"support.contact.category": "Category",
|
||||
"support.contact.subject": "Subject",
|
||||
"support.contact.subjectPlaceholder": "Summarize the problem in one line",
|
||||
"support.contact.details": "Details",
|
||||
"support.contact.detailsPlaceholder": "Describe when the problem happened",
|
||||
"support.contact.required": "This field is required.",
|
||||
"support.contact.diagnostics": "Diagnostic info included in the email",
|
||||
"support.contact.submit": "Write in mail app",
|
||||
"support.contact.opened": "Opened a draft in your mail app. Press send there to deliver your question.",
|
||||
"support.contact.openFailed": "Couldn't open your mail app. Email us directly at the address below.",
|
||||
"support.contact.address": "Support email",
|
||||
"ads.label": "Ad",
|
||||
"ads.testAd": "Test ad",
|
||||
"ads.learnMore": "Learn more",
|
||||
"ads.removeWithPro": "Remove ads with Pro",
|
||||
"ads.rewarded.title": "Watch an ad to recharge",
|
||||
"ads.rewarded.unavailableTitle": "No ad available",
|
||||
"ads.rewarded.checking": "Looking for a verified ad…",
|
||||
"ads.rewarded.notAvailable": "No verified ad is available right now. Try again in a moment.",
|
||||
"ads.rewarded.unreachable": "Couldn't reach the ad provider. Check your internet connection and try again.",
|
||||
"ads.rewarded.verifyFailed": "Couldn't verify the view, so nothing was added. Try again.",
|
||||
"ads.rewarded.verifyNote": "Credits are added only after the server verifies the view.",
|
||||
"ads.rewarded.ready": "Finished",
|
||||
"ads.rewarded.remaining": "{{seconds}}s left",
|
||||
"ads.rewarded.claim": "Recharge",
|
||||
"ads.rewarded.progress": "Ad playback progress",
|
||||
"onboarding.wizard.title": "Get started with D3RO Voice",
|
||||
"onboarding.wizard.progress": "Setup progress",
|
||||
"onboarding.wizard.skip": "Set up later",
|
||||
"onboarding.wizard.skipHint": "Skipping starts with the defaults (local mode). You can reopen this guide from Settings › About.",
|
||||
"onboarding.mode.intro": "Choose where speech recognition and AI processing run. You can change this in Settings at any time.",
|
||||
"onboarding.mode.local.title": "Local mode",
|
||||
"onboarding.mode.local.badge": "Recommended",
|
||||
"onboarding.mode.local.desc": "Uses Ollama and local Whisper to recognize speech and refine text on this PC.",
|
||||
"onboarding.mode.local.point1": "Works without an internet connection",
|
||||
"onboarding.mode.local.point2": "Speech recognition and AI processing stay on this PC",
|
||||
"onboarding.mode.local.point3": "No API fees (requires installing Ollama and downloading a model)",
|
||||
"onboarding.mode.local.action": "Start in local mode",
|
||||
"onboarding.mode.online.title": "Online mode",
|
||||
"onboarding.mode.online.desc": "Sign in with a D3RO account to use server-side speech recognition and AI models.",
|
||||
"onboarding.mode.online.point1": "No local models to install",
|
||||
"onboarding.mode.online.point2": "Sync across devices",
|
||||
"onboarding.mode.online.point3": "Requires a D3RO account",
|
||||
"onboarding.mode.online.action": "Sign in with an account",
|
||||
"onboarding.local.connected": "Connected to Ollama",
|
||||
"onboarding.local.connectedVersion": "Connected to Ollama (v{{version}})",
|
||||
"onboarding.local.disconnected": "Not connected to Ollama",
|
||||
"onboarding.local.connectedDetail": "{{count}} models installed · Using {{model}}",
|
||||
"onboarding.local.disconnectedDetail": "Ollama is not installed or not running.",
|
||||
"onboarding.local.recheck": "Check again",
|
||||
"onboarding.local.start": "Start Ollama",
|
||||
"onboarding.local.installTitle": "If you haven't installed Ollama yet",
|
||||
"onboarding.local.installStep1": "1. Download and install Ollama from ollama.com.",
|
||||
"onboarding.local.installStep2": "2. After installing, select 'Check again' and D3RO Voice connects to Ollama.",
|
||||
"onboarding.local.openDownload": "Open ollama.com/download",
|
||||
"onboarding.local.modelTitle": "Download the default AI model ({{model}})",
|
||||
"onboarding.local.modelDesc": "The default model for refining dictation, summaries, and translation. Available once Ollama is connected.",
|
||||
"onboarding.local.pull": "Download {{model}}",
|
||||
"onboarding.local.modelReady": "An AI model is already installed.",
|
||||
"onboarding.local.finish": "Finish setup",
|
||||
"onboarding.local.finishHint": "You can finish setup once Ollama is connected.",
|
||||
"onboarding.auth.intro": "Sign in with your D3RO account to start in online mode.",
|
||||
"onboarding.auth.email": "Email",
|
||||
"onboarding.auth.password": "Password",
|
||||
"onboarding.auth.submitLogin": "Sign in",
|
||||
"onboarding.auth.submitRegister": "Create account",
|
||||
"onboarding.auth.processing": "Working…",
|
||||
"onboarding.auth.failed": "Couldn't sign in. Check your email and password.",
|
||||
"onboarding.auth.error": "Couldn't sign in: {{message}}",
|
||||
"onboarding.done.title": "Setup complete",
|
||||
"onboarding.done.desc": "You can change the STT provider and Ollama model in Settings.",
|
||||
"onboarding.done.start": "Get started",
|
||||
"onboarding.failedPhase": "Setup failed. {{message}}",
|
||||
"ollamaGuide.start.running": "Ollama is already running.",
|
||||
"ollamaGuide.start.starting": "Started the Ollama server. Checking the connection.",
|
||||
"ollamaGuide.start.notInstalled": "Ollama isn't installed. Download and install it from ollama.com.",
|
||||
"ollamaGuide.start.failed": "Couldn't start Ollama. Start Ollama yourself, then select 'Check again'.",
|
||||
"ollamaGuide.title": "Ollama setup",
|
||||
"ollamaGuide.status.connected": "Connected to Ollama",
|
||||
"ollamaGuide.status.connectedVersion": "Connected to Ollama (v{{version}})",
|
||||
"ollamaGuide.status.disconnected": "Not connected to Ollama",
|
||||
"ollamaGuide.status.detail": "Server {{url}} · Using {{model}}",
|
||||
"ollamaGuide.recheck": "Check again",
|
||||
"ollamaGuide.start": "Start Ollama",
|
||||
"ollamaGuide.starting": "Starting…",
|
||||
"ollamaGuide.step1.title": "1. Install and start Ollama",
|
||||
"ollamaGuide.step1.desc": "Ollama is a free, open-source program that runs LLMs on this PC. Install and start it, and D3RO Voice connects to it.",
|
||||
"ollamaGuide.step1.download": "Download from ollama.com",
|
||||
"ollamaGuide.step2.title": "2. Download a model",
|
||||
"ollamaGuide.step2.desc": "Download a model for refining dictation, translation, and summaries. Ollama must be connected.",
|
||||
"ollamaGuide.step2.installedCount": "{{count}} models installed",
|
||||
"ollamaGuide.model.recommended": "Recommended",
|
||||
"ollamaGuide.model.gemma4e4b": "The app's default model. It doesn't use reasoning (thinking) tokens, so dictation refinement responds quickly.",
|
||||
"ollamaGuide.model.llama32": "A lightweight model from Meta, used for grammar fixes and tone adjustment.",
|
||||
"ollamaGuide.model.qwen25": "A lightweight model that supports many languages, including Korean.",
|
||||
"ollamaGuide.model.phi4": "A larger model for summaries and translation. 16 GB RAM or more recommended.",
|
||||
"ollamaGuide.model.inUse": "In use",
|
||||
"ollamaGuide.model.select": "Set as default",
|
||||
"ollamaGuide.model.pull": "Download",
|
||||
"ollamaGuide.model.pullAria": "Download {{model}}",
|
||||
"ollamaGuide.terminalHint": "To download from a terminal, run this command.",
|
||||
"ollamaGuide.step3.title": "3. Check that it works",
|
||||
"ollamaGuide.step3.desc": "Enter a sentence and run it — the model in use returns a refined version.",
|
||||
"ollamaGuide.test.sample": "Hello, tell me today's weather",
|
||||
"ollamaGuide.test.placeholder": "Sentence to refine",
|
||||
"ollamaGuide.test.inputLabel": "Test sentence",
|
||||
"ollamaGuide.test.run": "Run refine",
|
||||
"ollamaGuide.test.running": "Working",
|
||||
"ollamaGuide.test.result": "Refined result ({{model}})",
|
||||
"ollamaGuide.test.noResponse": "The model didn't respond.",
|
||||
"ollamaGuide.test.error": "Couldn't run: {{message}}",
|
||||
"ollamaGuide.footer": "With Ollama, AI processing stays on this PC.",
|
||||
"codexGuide.title": "Connecting OpenAI and Codex",
|
||||
"codexGuide.tab.apiKey": "OpenAI API key",
|
||||
"codexGuide.tab.codex": "Codex / ChatGPT subscription",
|
||||
"codexGuide.tab.providers": "Other STT service keys",
|
||||
"codexGuide.apiKey.introTitle": "Connect with an OpenAI API key",
|
||||
"codexGuide.apiKey.introDesc": "The OpenAI Whisper API is billed per minute of use, separately from a ChatGPT subscription. See OpenAI's pricing page for rates.",
|
||||
"codexGuide.apiKey.step1.title": "1. Open the API Keys page on OpenAI Platform",
|
||||
"codexGuide.apiKey.step1.desc": "Sign in with your OpenAI account to see your API keys.",
|
||||
"codexGuide.apiKey.step1.action": "Open API Keys",
|
||||
"codexGuide.apiKey.step2.title": "2. Create a new secret key and copy it",
|
||||
"codexGuide.apiKey.step2.desc": "Select 'Create new secret key' and enter a name to create a key starting with sk-proj-.",
|
||||
"codexGuide.apiKey.step2.warning": "The key is shown only once when created, so copy it right away.",
|
||||
"codexGuide.apiKey.step3.title": "3. Paste it into STT settings and test the connection",
|
||||
"codexGuide.apiKey.step3.desc": "In Settings › STT, choose OpenAI, paste the key into the API key field, and select 'Test connection' to confirm the key works.",
|
||||
"codexGuide.codex.introTitle": "For ChatGPT Plus, Pro, and Team subscribers",
|
||||
"codexGuide.codex.introDesc": "A ChatGPT subscription and the OpenAI Platform API are separate account systems. The Codex CLI authenticates by getting a token through browser OAuth (Device Flow).",
|
||||
"codexGuide.codex.step1.title": "1. Run the Device Auth login in a terminal",
|
||||
"codexGuide.codex.step1.desc": "Enter the 8-character code shown on screen on the browser authentication page.",
|
||||
"codexGuide.codex.step2.title": "2. If it doesn't connect",
|
||||
"codexGuide.codex.step2.proxy": "If a VPN or corporate proxy blocks the localhost redirect, use the --device-auth option.",
|
||||
"codexGuide.codex.step2.expired": "When the OAuth token expires, sign in again or use an API key instead.",
|
||||
"codexGuide.copyCommand": "Copy command",
|
||||
"codexGuide.providers.intro": "You can get an API key from these services and register it in STT settings.",
|
||||
"codexGuide.providers.groq": "Runs Whisper Large V3 on Groq's servers. Has a free usage limit.",
|
||||
"codexGuide.providers.deepgram": "Supports automatic punctuation and formatting. Free credit on sign-up.",
|
||||
"codexGuide.providers.google": "Get an API key from Google AI Studio.",
|
||||
"codexGuide.providers.assemblyai": "Get an API key from the AssemblyAI dashboard.",
|
||||
"codexGuide.providers.open": "Get {{name}} key",
|
||||
"records.notFound": "Couldn't find this record. It may have been deleted.",
|
||||
"records.tags.filterAria": "Filter by tag",
|
||||
"meetings.header.mic": "Mic: {{name}}",
|
||||
"meetings.header.engine": "Speech recognition: {{name}}",
|
||||
"meetings.engine.local": "Local Whisper",
|
||||
"meetings.defaultMic": "Default microphone",
|
||||
"meetings.starting": "Preparing…",
|
||||
"meetings.searchPlaceholder": "Search meeting titles",
|
||||
"meetings.empty.title": "No meetings yet",
|
||||
"meetings.empty.description": "Record a meeting to keep its transcript, then create a summary and documents.",
|
||||
"meetings.noResults.title": "No matching meetings",
|
||||
"meetings.noResults.description": "Only titles are searched. Try another term.",
|
||||
"meetings.noResults.partial": "Not found in the {{count}} loaded meetings. Load older meetings to keep looking.",
|
||||
"meetings.loadMore": "Load more",
|
||||
"meetings.loadingMore": "Loading",
|
||||
"meetings.shown": "{{shown}} of {{total}}",
|
||||
"meetings.loadError.title": "Couldn't load meetings",
|
||||
"meetings.loadError.description": "Something went wrong reading the meeting store. Try again, and restart the app if it keeps happening.",
|
||||
"meetings.loadMoreError": "Couldn't load more meetings.",
|
||||
"meetings.memoCount": "{{count}} notes",
|
||||
"meetings.status.recording": "Recording",
|
||||
"meetings.status.processing": "Saving",
|
||||
"meetings.status.error": "Error",
|
||||
"meetings.status.completed": "Done",
|
||||
"meetings.more": "More",
|
||||
"meetings.rename": "Rename",
|
||||
"meetings.renameDialog.title": "Rename meeting",
|
||||
"meetings.renameDialog.label": "Title",
|
||||
"meetings.renameFailed": "Couldn't rename: {{message}}",
|
||||
"meetings.delete.title": "Delete “{{title}}”?",
|
||||
"meetings.delete.body": "Its transcript, meeting notes, documents and audio are deleted too — on every synced device. This can't be undone.",
|
||||
"meetings.deleted": "Meeting deleted.",
|
||||
"meetings.deleteFailed": "Couldn't delete the meeting: {{message}}",
|
||||
"meetings.live.title": "Recording meeting",
|
||||
"meetings.live.stopping": "Stopping",
|
||||
"meetings.live.stopFailed": "Couldn't stop recording: {{message}}",
|
||||
"meetings.live.transcript": "Live transcript",
|
||||
"meetings.live.editHint": "Click a past sentence to fix it",
|
||||
"meetings.live.segmentCount": "{{count}} sentences",
|
||||
"meetings.live.waiting": "The transcript appears here once people start talking.",
|
||||
"meetings.live.editFailed": "Couldn't save the transcript edit: {{message}}",
|
||||
"meetings.live.memoTitle": "Meeting notes",
|
||||
"meetings.live.memoHint": "Notes are saved with their timestamp and weighted first when you create a summary.",
|
||||
"meetings.live.memoPlaceholder": "Type a note, press Enter",
|
||||
"meetings.live.memoFailed": "Couldn't save the note: {{message}}",
|
||||
"meetings.live.level": "Input level",
|
||||
"meetings.live.elapsed": "Elapsed time",
|
||||
"meetings.tag.decision": "#decision",
|
||||
"meetings.tag.todo": "#todo",
|
||||
"meetings.tag.agenda": "#agenda",
|
||||
"meetings.tag.idea": "#idea",
|
||||
"meetings.tag.issue": "#issue",
|
||||
"meetings.detail.back": "All meetings",
|
||||
"meetings.detail.copySummary": "Copy summary",
|
||||
"meetings.detail.copyTranscript": "Copy transcript",
|
||||
"meetings.detail.summaryCopied": "Summary copied.",
|
||||
"meetings.detail.transcriptCopied": "Transcript copied.",
|
||||
"meetings.detail.copyFailed": "Couldn't copy to the clipboard.",
|
||||
"meetings.export.label": "Export",
|
||||
"meetings.export.summaryGroup": "Summary",
|
||||
"meetings.export.transcriptGroup": "Transcript",
|
||||
"meetings.export.noSummary": "Create a summary to export it",
|
||||
"meetings.export.done": "Saved: {{path}}",
|
||||
"meetings.export.failed": "Couldn't export: {{message}}",
|
||||
"meetings.format.md": "Markdown (.md)",
|
||||
"meetings.format.txt": "Text (.txt)",
|
||||
"meetings.format.pdf": "PDF (.pdf)",
|
||||
"meetings.format.docx": "Word (.docx)",
|
||||
"meetings.tabs.label": "Meeting content",
|
||||
"meetings.tab.summary": "Summary",
|
||||
"meetings.tab.transcript": "Transcript",
|
||||
"meetings.tab.documents": "Documents",
|
||||
"meetings.tab.notes": "My notes",
|
||||
"meetings.ask": "Ask",
|
||||
"meetings.askClose": "Close questions",
|
||||
"meetings.askSend": "Send",
|
||||
"meetings.summary.empty.title": "No summary yet",
|
||||
"meetings.summary.empty.description": "Turn the transcript into a summary, decisions and to-dos.",
|
||||
"meetings.summary.empty.noTranscript": "There's no transcript to summarize.",
|
||||
"meetings.summary.create": "Create summary",
|
||||
"meetings.summary.creating": "Creating summary…",
|
||||
"meetings.summary.chooseTemplate": "Use another format",
|
||||
"meetings.summary.edit": "Edit in Documents",
|
||||
"meetings.summary.actionItems": "To-dos",
|
||||
"meetings.summary.copyActionItems": "Copy to-dos",
|
||||
"meetings.summary.actionItemsCopied": "To-dos copied.",
|
||||
"meetings.summary.decisions": "Decisions",
|
||||
"meetings.summary.generateFailed": "Couldn't create the document: {{message}}",
|
||||
"meetings.doc.new": "New document",
|
||||
"meetings.doc.untitled": "Document {{n}}",
|
||||
"meetings.doc.list": "Documents",
|
||||
"meetings.doc.primaryHint": "The first document is shown in Summary.",
|
||||
"meetings.doc.empty.title": "No documents",
|
||||
"meetings.doc.empty.description": "Pick a format — minutes, report, idea note — and build a document from the transcript.",
|
||||
"meetings.doc.delete.title": "Delete “{{title}}”?",
|
||||
"meetings.doc.delete.body": "Only this document is deleted, and it can't be undone. The transcript and meeting notes stay.",
|
||||
"meetings.doc.deleted": "Document deleted.",
|
||||
"meetings.notes.recordedTitle": "Notes taken while recording",
|
||||
"meetings.notes.padTitle": "My notes",
|
||||
"meetings.notes.padHint": "Saved automatically on this device. Not synced to other devices.",
|
||||
"meetings.notes.placeholder": "Jot down what was discussed, customer feedback, your to-dos.",
|
||||
"meetings.notes.enhance": "Create minutes from notes",
|
||||
"meetings.notes.enhancing": "Creating…",
|
||||
"meetings.notes.enhanceHint": "Combines your notes with the transcript into a new document.",
|
||||
"meetings.notes.enhancedDocTitle": "Minutes from my notes",
|
||||
"meetings.notes.saveFailed": "Couldn't save your notes on this device. Check free storage.",
|
||||
"meetings.transcript.empty": "Nothing was transcribed.",
|
||||
"meetings.transcript.memo": "Note",
|
||||
"meetings.error.reason": "Cause",
|
||||
"meetings.error.fix": "How to fix",
|
||||
"meetings.error.openAudioSettings": "Open audio settings",
|
||||
"meetings.error.openSttSettings": "Open speech recognition settings",
|
||||
"meetings.error.forceStart": "Clean up running session and start",
|
||||
"meetings.error.forceRetry": "Reset and try again",
|
||||
"meetings.error.collision.title": "Another meeting or live caption is still running",
|
||||
"meetings.error.collision.message": "A previous meeting session or caption is still running in the background.",
|
||||
"meetings.error.collision.reason": "The previous meeting/caption process didn't fully stop, so it collided with the new recording.",
|
||||
"meetings.error.collision.suggestion": "Clean up the running session to start a new meeting right away.",
|
||||
"meetings.error.stt.title": "Couldn't prepare speech recognition (STT)",
|
||||
"meetings.error.stt.message": "The speech recognition engine or Whisper model failed to load.",
|
||||
"meetings.error.stt.reason": "The local Whisper model isn't ready, or the sidecar process port is in use.",
|
||||
"meetings.error.stt.suggestion": "Check the model download in speech recognition settings, or reset and try again.",
|
||||
"meetings.error.audio.title": "Couldn't start the microphone",
|
||||
"meetings.error.audio.message": "The microphone audio stream couldn't be opened.",
|
||||
"meetings.error.audio.reason": "No default microphone was found, or Windows microphone access is off.",
|
||||
"meetings.error.audio.suggestion": "Pick a microphone in audio settings, or retry with the default device.",
|
||||
"meetings.error.processing.title": "Couldn't save the meeting",
|
||||
"meetings.error.processing.message": "An error occurred while saving the transcript after recording.",
|
||||
"meetings.error.processing.reason": "The meeting record couldn't be written to the database after recording stopped.",
|
||||
"meetings.error.processing.suggestion": "The failed meeting stays in the list with an error status. Check disk space, then open it from the list.",
|
||||
"meetings.error.general.title": "Couldn't start the meeting",
|
||||
"meetings.error.general.message": "Meeting recording failed to start for an unknown reason.",
|
||||
"meetings.error.general.reason": "Something went wrong in background communication or initialization.",
|
||||
"meetings.error.general.suggestion": "Reset and try starting again.",
|
||||
"popup.result.title": "Couldn't insert · copy and paste it",
|
||||
"popup.copied": "Copied",
|
||||
"popup.hints.move": "Move",
|
||||
"popup.hints.paste2": "Paste",
|
||||
"popup.hints.apply2": "Apply",
|
||||
"popup.hints.close2": "Close",
|
||||
"popup.hints.pick": "Pick by number",
|
||||
"popup.history.title": "Recent dictation",
|
||||
"popup.history.empty": "Nothing dictated yet.",
|
||||
"popup.command.title": "Choose a command",
|
||||
"popup.command.empty": "No commands yet.",
|
||||
"popup.command.none": "Insert original text (no command)",
|
||||
"settings.closeToTray.desc": "Closing the window keeps D3RO Voice running in the tray so shortcuts keep working.",
|
||||
"settings.autoLaunch.desc": "Starts D3RO Voice when you sign in to your computer.",
|
||||
"settings.autoInsert.desc": "Inserts the transcript into the app at your cursor as soon as it's ready.",
|
||||
"settings.soundEffects.desc": "Plays a sound when recording starts and stops.",
|
||||
"settings.micTest": "Microphone test",
|
||||
"settings.micTest.desc": "Press Test and speak — the bar should move. If it doesn't, choose another input device.",
|
||||
"settings.micTest.level": "Input level",
|
||||
"settings.micTest.failed": "Couldn't open the microphone. Check that no other app is using it and that microphone access is on in Windows settings.",
|
||||
"settings.llm.engineSection": "AI engine",
|
||||
"settings.llm.engine": "Where AI runs",
|
||||
"settings.llm.engine.desc": "Choose where refinement, summaries, and commands are processed.",
|
||||
"settings.llm.engine.local": "Local Ollama — runs on this PC, works offline",
|
||||
"settings.llm.engine.online": "D3RO online API — sign-in required",
|
||||
"settings.llm.ollamaStatus": "Ollama connection",
|
||||
"settings.llm.ollamaChecking": "Checking connection",
|
||||
"settings.llm.ollamaConnected": "Connected · {{count}} models installed",
|
||||
"settings.llm.ollamaConnectedVersion": "Connected · v{{version}} · {{count}} models installed",
|
||||
"settings.llm.ollamaOffline": "Not connected — start the Ollama server to use local AI processing.",
|
||||
"settings.llm.checkConnection": "Check connection",
|
||||
"settings.llm.startOllama": "Start Ollama",
|
||||
"settings.llm.startingOllama": "Starting",
|
||||
"settings.llm.guide": "Setup and models",
|
||||
"settings.llm.guide.desc": "How to install Ollama and which models you can download.",
|
||||
"settings.llm.openGuide": "Open guide",
|
||||
"settings.llm.feedback.running": "Ollama is already running.",
|
||||
"settings.llm.feedback.started": "Started the Ollama server. Checking the connection again shortly.",
|
||||
"settings.llm.feedback.notInstalled": "Ollama isn't installed. Open the setup guide to install it.",
|
||||
"settings.llm.feedback.failed": "Couldn't start Ollama. Check the setup guide.",
|
||||
"settings.llm.serverUrl.desc": "Change only if Ollama runs at a different address.",
|
||||
"settings.llm.activeModel": "Model",
|
||||
"settings.llm.activeModel.desc": "The Ollama model used for refinement, summaries, and chat.",
|
||||
"settings.llm.modelRecommended": "{{name}} (recommended · not installed)",
|
||||
"settings.llm.modelNotInstalled": "{{name}} (not installed)",
|
||||
"settings.llm.onlineUrl": "API server URL",
|
||||
"settings.llm.account": "Account",
|
||||
"settings.llm.accountSignedIn": "Signed in as {{email}}",
|
||||
"settings.llm.accountSignedInNoEmail": "Signed in",
|
||||
"settings.llm.accountSignedOut": "Not signed in — sign in from the License tab to use the online API.",
|
||||
"settings.about.appName": "D3RO Voice",
|
||||
"settings.about.summary": "A voice assistant that runs speech recognition and AI processing on this PC. The online API and device sync use the internet only when you turn them on.",
|
||||
"settings.about.helpSection": "Help",
|
||||
"settings.about.restartOnboarding.desc": "Opens the first-run guide again. The app window reloads.",
|
||||
"settings.about.restartOnboarding.action": "Open guide",
|
||||
"settings.stt.engineSection": "Speech recognition engine",
|
||||
"settings.stt.openGuide": "OpenAI & Codex setup guide",
|
||||
"settings.stt.engine": "Engine",
|
||||
"settings.stt.provider.local.desc": "Recognizes speech with Whisper on this PC. Works offline and never sends audio out.",
|
||||
"settings.stt.provider.d3roCloud.desc": "Recognizes speech on D3RO servers. Authenticates with your D3RO account, so no API key is needed.",
|
||||
"settings.stt.provider.openai.desc": "Sends audio to OpenAI for recognition. Requires an OpenAI API key.",
|
||||
"settings.stt.provider.groq.desc": "Sends audio to Groq for recognition. Fast responses; requires a Groq API key.",
|
||||
"settings.stt.provider.deepgram.desc": "Sends audio to Deepgram for recognition. Adds punctuation and formatting automatically. Requires an API key.",
|
||||
"settings.stt.provider.assemblyai.desc": "Sends audio to AssemblyAI for recognition. Requires an API key.",
|
||||
"settings.stt.provider.google.desc": "Sends audio to Google Gemini for recognition. Supports many languages including Korean. Requires an API key.",
|
||||
"settings.stt.provider.custom.desc": "Sends audio to an OpenAI-compatible endpoint (vLLM, a self-hosted server, etc.). Set the address under Advanced.",
|
||||
"settings.stt.modelInstalled": "Installed",
|
||||
"settings.stt.modelNotDownloaded": "Not downloaded",
|
||||
"settings.stt.modelNeedsDownload": "{{name}} isn't downloaded yet · about {{size}} MB",
|
||||
"settings.stt.downloadModel": "Download model",
|
||||
"settings.stt.downloading": "Downloading {{percent}}%",
|
||||
"settings.stt.runtime.sidecar": "Local speech engine (faster-whisper)",
|
||||
"settings.stt.runtime.ffmpeg": "Media converter (ffmpeg)",
|
||||
"settings.stt.runtime.installed": "Installed · {{size}} MB",
|
||||
"settings.stt.runtime.missing": "Not installed — required for local transcription",
|
||||
"settings.stt.runtime.install": "Download",
|
||||
"settings.stt.runtime.reinstall": "Reinstall",
|
||||
"settings.stt.apiKey": "API key",
|
||||
"settings.stt.apiKey.desc": "Paste the key issued by {{name}}. Use Test connection to check it.",
|
||||
"settings.stt.apiKeyPlaceholder": "Paste API key",
|
||||
"settings.stt.account": "D3RO account",
|
||||
"settings.stt.account.desc": "Authenticates with the D3RO account you're signed in to. Use Test connection to check access.",
|
||||
"settings.stt.showKey": "Show key",
|
||||
"settings.stt.hideKey": "Hide key",
|
||||
"settings.stt.testConnection": "Test connection",
|
||||
"settings.stt.testing": "Testing",
|
||||
"settings.stt.languageSection": "Language",
|
||||
"settings.stt.advancedSection": "Advanced",
|
||||
"settings.stt.advanced.desc": "Model ID · endpoint · fallback",
|
||||
"settings.stt.advanced.show": "Show",
|
||||
"settings.stt.advanced.hide": "Hide",
|
||||
"settings.stt.modelId": "Model ID",
|
||||
"settings.stt.modelId.desc": "Default: {{model}}",
|
||||
"settings.stt.modelId.auto": "automatic",
|
||||
"settings.stt.baseUrl": "API endpoint URL",
|
||||
"settings.stt.baseUrl.desc": "Change only when using a proxy or self-hosted server.",
|
||||
"tools.builtin": "Built-in",
|
||||
"tools.editItem": "Edit {{name}}",
|
||||
"tools.deleteItem": "Delete {{name}}",
|
||||
"tools.deleteFailed": "Couldn't delete. The item was restored — try again in a moment.",
|
||||
"tools.copyFailed": "Couldn't copy. Check clipboard permission.",
|
||||
"tools.loadMore": "Show more ({{shown}}/{{total}})",
|
||||
"tools.commands.description": "Choose how AI polishes what you dictate.",
|
||||
"tools.commands.add": "Add command",
|
||||
"tools.commands.listTitle": "Command to use",
|
||||
"tools.commands.listHint": "Your choice applies from the next dictation.",
|
||||
"tools.commands.none": "No AI command",
|
||||
"tools.commands.noneHint": "Inserts what you said as-is.",
|
||||
"tools.commands.inUse": "In use",
|
||||
"tools.commands.empty": "No commands yet",
|
||||
"tools.commands.emptyHint": "Select Add command to save a polishing style you use often.",
|
||||
"tools.commands.loadFailed": "Couldn't load commands.",
|
||||
"tools.commands.selectFailed": "Couldn't change the command. The previous setting was restored.",
|
||||
"tools.commands.deleted": "Deleted command '{{name}}'.",
|
||||
"tools.commands.action.expand": "Expand",
|
||||
"tools.commands.action.chain": "Chain",
|
||||
"tools.commands.pipeline.current": "Dictation post-processing:",
|
||||
"tools.commands.pipeline.missing": "No command selected",
|
||||
"tools.commands.pipeline.stepsLabel": "Dictation steps",
|
||||
"tools.commands.pipeline.stepStt": "Speech becomes text, using dictionary words as recognition hints.",
|
||||
"tools.commands.pipeline.stepRaw": "No AI post-processing.",
|
||||
"tools.commands.pipeline.stepInstruction": "AI polishes it with '{{name}}'.",
|
||||
"tools.commands.pipeline.stepMissing": "Set to use a command, but none is selected — pick one below.",
|
||||
"tools.commands.pipeline.stepAction": "AI applies the default action ({{action}}). Change it in Settings > LLM.",
|
||||
"tools.commands.pipeline.stepInsert": "The result goes into the window you were typing in.",
|
||||
"tools.commands.test.title": "Try a command",
|
||||
"tools.commands.test.description": "Process one sentence the same way dictation does and preview the result.",
|
||||
"tools.commands.test.placeholder": "Type a sentence as if you had dictated it",
|
||||
"tools.commands.test.inputLabel": "Sentence to try",
|
||||
"tools.commands.test.run": "Run",
|
||||
"tools.commands.test.running": "Running…",
|
||||
"tools.commands.test.result": "Result",
|
||||
"tools.commands.test.failed": "Couldn't process: {{reason}}",
|
||||
"tools.commands.test.blockedRaw": "AI post-processing is off, so the result equals the input.",
|
||||
"tools.commands.test.blockedChain": "Chains run several steps and can't be tried here.",
|
||||
"tools.commands.test.blockedMissing": "Pick a command to use first.",
|
||||
"tools.templates.description": "Say each field in turn and it fills a fixed format.",
|
||||
"tools.templates.emptyHint": "Select New Template to create a format you use often.",
|
||||
"tools.templates.fieldCount": "{{count}} fields",
|
||||
"tools.templates.lastOutput": "Last result",
|
||||
"tools.templates.deleted": "Deleted template '{{name}}'.",
|
||||
"tools.templates.startItem": "Start {{name}}",
|
||||
"tools.templates.removeField": "Remove field {{n}}",
|
||||
"tools.dictionary.description": "Dictation uses these words as recognition hints (up to 50).",
|
||||
"tools.dictionary.add": "Add word",
|
||||
"tools.dictionary.search": "Search words",
|
||||
"tools.dictionary.empty": "No words yet",
|
||||
"tools.dictionary.emptyHint": "Add names and jargon that dictation often gets wrong.",
|
||||
"tools.dictionary.noResultsHint": "Try a different search.",
|
||||
"tools.dictionary.loadFailed": "Couldn't load the dictionary.",
|
||||
"tools.dictionary.deleted": "Deleted '{{word}}'.",
|
||||
"tools.dictionary.pronunciationValue": "said as {{value}}",
|
||||
"tools.dictionary.pronunciationHelp": "e.g. dee-three-oh — stored for reference; only the word is used as a hint.",
|
||||
"tools.dictionary.formatJson": "JSON file",
|
||||
"tools.dictionary.formatCsv": "CSV file",
|
||||
"tools.knowledge.description": "Ask about the documents you add and get answers from the relevant parts. Documents are indexed on this device.",
|
||||
"tools.knowledge.ask": "Ask",
|
||||
"tools.knowledge.examples": "Examples",
|
||||
"tools.knowledge.example.summary": "Summarize these documents in three lines",
|
||||
"tools.knowledge.example.schedule": "List the key dates and milestones",
|
||||
"tools.knowledge.example.policy": "What are the security and privacy policies?",
|
||||
"tools.knowledge.answer": "Answer",
|
||||
"tools.knowledge.similarity": "{{percent}}% match",
|
||||
"tools.knowledge.queryFailed": "Couldn't find an answer. Check document indexing and the AI connection, then ask again.",
|
||||
"tools.knowledge.queryNeedsDocs": "Add a document first to ask questions",
|
||||
"tools.knowledge.chunkProgress": "Chunk {{current}}/{{total}} · {{percent}}%",
|
||||
"tools.knowledge.chunkCount": "{{count}} chunks",
|
||||
"tools.knowledge.notIndexed": "Not indexed",
|
||||
"tools.knowledge.reindexItem": "Reindex {{name}}",
|
||||
"tools.knowledge.deleted": "Deleted document '{{name}}'.",
|
||||
"tools.knowledge.loadFailed": "Couldn't load documents.",
|
||||
"tools.knowledge.emptyHint": "Add TXT, MD, PDF or DOCX files to ask about their contents.",
|
||||
"tools.insights.loadFailed": "Couldn't load input collection status.",
|
||||
"tools.insights.openSettings": "Open input settings",
|
||||
"tools.conversation.description": "Talk or type to chat with AI.",
|
||||
"tools.conversation.modeRealtime": "Realtime mode",
|
||||
"tools.conversation.start": "Start conversation",
|
||||
"tools.conversation.finish": "Stop talking and send",
|
||||
"tools.conversation.stop": "Stop conversation",
|
||||
"tools.conversation.cancelResponse": "Cancel response",
|
||||
"tools.conversation.send": "Send",
|
||||
"tools.conversation.clearTitle": "Clear conversation history?",
|
||||
"tools.conversation.clearBody": "All {{count}} messages will be removed. This can't be undone.",
|
||||
"tools.conversation.clearConfirm": "Clear",
|
||||
"tools.conversation.clearFailed": "Couldn't clear the history. Try again."
|
||||
}
|
||||
|
|
|
|||
|
|
@ -145,8 +145,8 @@
|
|||
"settings.sttProvider.assemblyai": "AssemblyAI Universal-2 (음향 모델)",
|
||||
"settings.sttProvider.google": "Google Gemini 2.0 Flash Audio",
|
||||
"settings.sttProvider.custom": "커스텀 OpenAI 호환 엔드포인트",
|
||||
"settings.sttFallbackToLocal": "로컬 Whisper 자동 폴백",
|
||||
"settings.sttFallbackToLocalHint": "클라우드 STT 실패 시 오프라인 로컬 Whisper로 자동 전환",
|
||||
"settings.sttFallbackToLocal": "실패하면 로컬 Whisper로 전환",
|
||||
"settings.sttFallbackToLocalHint": "클라우드 인식이 실패하면(인터넷 끊김·사용량 초과·키 오류) 이 PC의 Whisper로 다시 인식합니다.",
|
||||
"settings.whisperModel": "받아쓰기 모델",
|
||||
"settings.model.tiny": "tiny (39 MB, 가장 빠름)",
|
||||
"settings.model.base": "base (74 MB, 균형)",
|
||||
|
|
@ -1693,7 +1693,7 @@
|
|||
"keybinding.disabled.mouseLeft": "왼쪽 클릭은 모든 화면 조작에 쓰이므로 바인딩할 수 없습니다",
|
||||
"keybinding.warning.mousePassthrough": "마우스 버튼은 원래 동작도 함께 실행됩니다",
|
||||
"keybinding.ui.add": "추가",
|
||||
"keybinding.ui.remove": "삭제",
|
||||
"keybinding.ui.remove": "{{keys}} 삭제",
|
||||
"keybinding.ui.reset": "기본값으로",
|
||||
"keybinding.ui.tabRecord": "직접 입력",
|
||||
"keybinding.ui.tabList": "목록에서 선택",
|
||||
|
|
@ -1717,7 +1717,7 @@
|
|||
"keybinding.ui.globalEnabled": "전역 단축키 사용",
|
||||
"input.tab": "입력",
|
||||
"input.consent.title": "입력 데이터 수집",
|
||||
"input.consent.description": "선택 사항입니다. 키 입력과 클릭 횟수, 마우스 이동 거리를 세어 자신의 입력 패턴을 보여니다. 어떤 키를 눌렀는지는 저장하지 않습니다.",
|
||||
"input.consent.description": "선택 사항입니다. 키 입력과 클릭 횟수, 마우스 이동 거리를 세어 자신의 입력 패턴을 보여 줍니다. 어떤 키를 눌렀는지는 저장하지 않습니다.",
|
||||
"input.consent.collect": "키보드·마우스 통계 수집",
|
||||
"input.consent.running": "수집 중입니다.",
|
||||
"input.consent.stopped": "수집이 꺼져 있습니다. 아무것도 기록하지 않습니다.",
|
||||
|
|
@ -1729,7 +1729,7 @@
|
|||
"input.consent.excludedAppsHint": "쉼표로 구분한 실행 파일명입니다. 이 앱에서는 아무것도 읽거나 세지 않습니다.",
|
||||
"input.consent.clearAll": "수집된 데이터 삭제",
|
||||
"input.suggestion.title": "다음 문장 제안",
|
||||
"input.suggestion.description": "앞으로 나올 문장을 예측해 커서 에 보여니다. 수락하면 그대로 삽입됩니다.",
|
||||
"input.suggestion.description": "앞으로 나올 문장을 예측해 커서 옆에 보여 줍니다. 수락하면 그대로 삽입됩니다.",
|
||||
"input.suggestion.enabled": "타이핑 중 제안 표시",
|
||||
"input.suggestion.modelReady": "로컬 모델 준비됨.",
|
||||
"input.suggestion.modelMissing": "로컬 모델이 실행 중이 아닙니다 — 제안이 꺼진 상태로 동작합니다.",
|
||||
|
|
@ -1738,10 +1738,10 @@
|
|||
"input.suggestion.modelDefault": "기본 모델 사용",
|
||||
"input.suggestion.overlayInteractive": "제안 상자 클릭 허용",
|
||||
"input.suggestion.overlayVisible": "제안이 화면에 표시됨",
|
||||
"input.suggestion.keyHint": "수락·다음 후보·닫기는 전역 키바인딩입니다 — 설정 > 단축키에서 바 수 있습니다.",
|
||||
"input.suggestion.keyHint": "수락·다음 후보·닫기는 전역 키바인딩입니다 — 설정 > 단축키에서 바꿀 수 있습니다.",
|
||||
"input.suggestion.requestNow": "지금 제안 받기",
|
||||
"input.suggestion.usage": "오늘 {{requests}}/{{budget}}회 사용",
|
||||
"input.suggestion.lastSkip": "마지막 건너 사유: {{reason}}",
|
||||
"input.suggestion.lastSkip": "마지막으로 건너뛴 이유: {{reason}}",
|
||||
"input.insights.title": "최근 {{days}}일",
|
||||
"input.insights.keystrokes": "키 입력",
|
||||
"input.insights.clicks": "클릭",
|
||||
|
|
@ -1774,7 +1774,7 @@
|
|||
"keybinding.action.suggestionDismiss.desc": "현재 제안을 숨깁니다.",
|
||||
"input.suggestion.timeout": "응답 제한 (ms)",
|
||||
"input.suggestion.latency": "마지막 응답: {{ms}}ms",
|
||||
"input.suggestion.slowWarning": "타이 속도에 비해 느립니다 — 더 작은 모델을 쓰거나 후보 수를 줄여보세요.",
|
||||
"input.suggestion.slowWarning": "타이핑 속도에 비해 느립니다 — 더 작은 모델을 쓰거나 후보 수를 줄여 보세요.",
|
||||
"input.diagnostics.title": "실시간 진단",
|
||||
"input.diagnostics.app": "포커스 앱: {{app}}",
|
||||
"input.diagnostics.unknownApp": "(알 수 없음)",
|
||||
|
|
@ -1788,13 +1788,13 @@
|
|||
"input.suggestion.onScreen": "표시 중",
|
||||
"input.suggestion.offScreen": "없음",
|
||||
"input.suggestion.generating": "생성 중…",
|
||||
"input.kbView.knowledge": "지식 베이스",
|
||||
"input.kbView.knowledge": "지식",
|
||||
"input.kbView.insights": "입력 인사이트",
|
||||
"input.insights.tabs.overview": "요약",
|
||||
"input.insights.tabs.keyboard": "키보드",
|
||||
"input.insights.tabs.mouse": "마우스",
|
||||
"input.insights.tabs.apps": "앱",
|
||||
"input.insights.tabs.phrases": "문구 · 제안",
|
||||
"input.insights.tabs.phrases": "문구와 제안",
|
||||
"input.insights.chars": "입력한 글자",
|
||||
"input.insights.wordChars": "글자",
|
||||
"input.insights.backspaces": "지우기",
|
||||
|
|
@ -1842,7 +1842,7 @@
|
|||
"popup.suggestion.hintGeneratingMore": "더 생성 중… (최대 {{max}}개)",
|
||||
"keybinding.action.suggestionPrev": "이전 제안",
|
||||
"keybinding.action.suggestionPrev.desc": "이전 제안 후보로 이동합니다.",
|
||||
"input.insights.tabs.graph": "그래프",
|
||||
"input.insights.tabs.graph": "문장 그래프",
|
||||
"input.graph.description": "내 문장을 노드로, 문장 사이의 관계(무엇이 무엇 뒤에 오는지, 어떤 용어를 공유하는지)를 엣지로 저장해 제안에 개인 문맥을 끌어옵니다. 전부 로컬입니다.",
|
||||
"input.graph.nodes": "문장 노드",
|
||||
"input.graph.followsEdges": "이어쓰기 연결",
|
||||
|
|
@ -1939,5 +1939,620 @@
|
|||
"history.stopAudio": "재생 멈춤",
|
||||
"history.audioUnavailable": "들을 수 있는 녹음이 없습니다 (다른 기기 녹음은 그 기기의 동기화가 끝나면 들을 수 있어요)",
|
||||
"cloudSync.audio": "녹음 파일도 동기화",
|
||||
"cloudSync.audioDesc": "녹음을 클라우드에 올려 모바일·웹에서 들을 수 있게 합니다. 50MB를 넘는 파일은 이 컴퓨터에만 둡니다."
|
||||
"cloudSync.audioDesc": "녹음을 클라우드에 올려 모바일·웹에서 들을 수 있게 합니다. 50MB를 넘는 파일은 이 컴퓨터에만 둡니다.",
|
||||
"nav.home": "홈",
|
||||
"nav.records": "기록",
|
||||
"nav.tools": "도구",
|
||||
"nav.aiChat": "AI 대화",
|
||||
"nav.support": "고객 지원",
|
||||
"nav.mainLabel": "주 메뉴",
|
||||
"nav.shortcutHint": "Ctrl+{{n}}",
|
||||
"shell.localAi.connected": "로컬 AI 연결됨",
|
||||
"shell.localAi.offline": "로컬 AI 꺼짐",
|
||||
"shell.localAi.checking": "로컬 AI 확인 중",
|
||||
"shell.localAi.setup": "켜는 방법",
|
||||
"shell.live.caption": "자막 켜짐",
|
||||
"shell.live.meeting": "회의 녹음 중",
|
||||
"shell.rewardClaimed": "클라우드 다듬기 {{tokens}}회가 충전되었습니다.",
|
||||
"home.title": "오늘",
|
||||
"home.dictationHint": "누른 채 말하면 받아쓰고, 떼면 커서 자리에 넣습니다.",
|
||||
"home.dictationUnbound": "받아쓰기 단축키가 없습니다.",
|
||||
"home.setShortcut": "단축키 설정",
|
||||
"home.action.newMeeting": "새 회의",
|
||||
"home.action.captionStart": "실시간 자막 켜기",
|
||||
"home.action.captionStop": "자막 끄기",
|
||||
"home.action.captionStarting": "자막 준비 중",
|
||||
"home.action.captionBlocked": "회의 녹음 중에는 회의가 자막을 씁니다.",
|
||||
"home.recentRecords": "최근 기록",
|
||||
"home.recentMeetings": "최근 회의",
|
||||
"home.viewAll": "모두 보기",
|
||||
"home.emptyRecords": "아직 기록이 없습니다.",
|
||||
"home.emptyMeetings": "아직 회의가 없습니다.",
|
||||
"home.summary.sessions": "오늘 {{count}}회",
|
||||
"home.summary.words": "{{count}}단어",
|
||||
"home.summary.minutes": "녹음 {{time}}",
|
||||
"home.summary.streak": "연속 {{count}}일",
|
||||
"home.summary.label": "오늘 사용 요약",
|
||||
"home.fileTranscription": "파일 전사",
|
||||
"home.status.llmOffline": "로컬 AI(Ollama)가 꺼져 있어 다듬기·요약·회의록을 만들 수 없습니다. 받아쓰기는 그대로 됩니다.",
|
||||
"home.status.openGuide": "켜는 방법",
|
||||
"home.usage.title": "오늘 사용량",
|
||||
"home.usage.unlimited": "무제한",
|
||||
"home.meetingDuration": "{{time}}",
|
||||
"home.meetingInProgress": "진행 중",
|
||||
"record.mode.dictation": "받아쓰기",
|
||||
"record.mode.caption": "자막",
|
||||
"record.mode.file": "파일",
|
||||
"record.mode.command": "명령",
|
||||
"record.mode.translate": "번역",
|
||||
"record.mode.conversation": "대화",
|
||||
"license.feature.premium_llm": "클라우드 AI 다듬기",
|
||||
"license.feature.cloud_sync": "기기 간 동기화",
|
||||
"license.feature.team_workspace": "팀 공유 공간",
|
||||
"license.team": "팀",
|
||||
"license.enterprise": "엔터프라이즈",
|
||||
"common.clear": "지우기",
|
||||
"common.undo": "되돌리기",
|
||||
"common.deleted": "삭제했습니다.",
|
||||
"common.copied": "복사했습니다.",
|
||||
"voice.error.micOpen": "마이크를 열지 못했습니다. 설정 → 오디오에서 입력 장치를 확인하세요.",
|
||||
"voice.error.micLost": "녹음 중 마이크 연결이 끊겼습니다.",
|
||||
"voice.error.noSpeech": "말소리가 들리지 않았습니다. 마이크 입력을 확인하세요.",
|
||||
"voice.error.tooShort": "너무 짧아서 받아쓰지 않았습니다.",
|
||||
"voice.error.transcription": "받아쓰기에 실패했습니다. 다시 시도해 주세요.",
|
||||
"voice.error.captionActive": "실시간 자막이 켜져 있어 받아쓰기를 시작할 수 없습니다.",
|
||||
"voice.error.llmFailed": "AI 다듬기에 실패해 텍스트를 넣지 못했습니다.",
|
||||
"popup.tip.processing": "받아쓰는 중",
|
||||
"popup.tip.waitingEngine": "음성 엔진 준비 중",
|
||||
"popup.tip.inserted": "입력함",
|
||||
"popup.tip.cancelHint": "Esc 취소",
|
||||
"popup.tip.recordingLabel": "녹음 중",
|
||||
"popup.close": "닫기",
|
||||
"records.searchPlaceholder": "기록 검색 — 본문·제목·요약",
|
||||
"records.filter.label": "기록 필터",
|
||||
"records.filter.all": "전체",
|
||||
"records.filter.commandTranslate": "명령·번역",
|
||||
"records.filter.favorites": "즐겨찾기만",
|
||||
"records.filter.clear": "필터 지우기",
|
||||
"records.tags.label": "태그",
|
||||
"records.tags.showAll": "태그 {{count}}개 더 보기",
|
||||
"records.tags.showLess": "태그 접기",
|
||||
"records.empty.title": "아직 기록이 없습니다",
|
||||
"records.empty.description": "받아쓰기 단축키를 누르고 말하면, 받아쓴 글이 여기에 날짜별로 쌓입니다.",
|
||||
"records.empty.shortcut": "받아쓰기 단축키",
|
||||
"records.empty.unbound": "받아쓰기 단축키가 아직 없습니다.",
|
||||
"records.empty.setShortcut": "단축키 설정",
|
||||
"records.noResults.title": "결과 없음",
|
||||
"records.noResults.description": "검색어나 필터를 바꿔 보세요.",
|
||||
"records.noResults.partial": "불러온 기록 {{count}}건에서는 찾지 못했습니다. 더 오래된 기록에서 계속 찾을 수 있습니다.",
|
||||
"records.searchOlder": "이전 기록에서 계속 찾기",
|
||||
"records.loadMore": "더 불러오기",
|
||||
"records.loadingMore": "불러오는 중",
|
||||
"records.loading": "기록을 불러오는 중",
|
||||
"records.shown": "{{total}}건 중 {{shown}}건 불러옴",
|
||||
"records.loadError.title": "기록을 불러오지 못했습니다",
|
||||
"records.loadError.description": "기록 저장소를 읽는 중 문제가 생겼습니다. 다시 시도하고, 계속되면 앱을 다시 시작하세요.",
|
||||
"records.loadMoreError": "다음 기록을 불러오지 못했습니다.",
|
||||
"records.status.cancelled": "취소됨",
|
||||
"records.status.error": "오류",
|
||||
"records.section.polished": "다듬은 글",
|
||||
"records.section.original": "원문",
|
||||
"records.showOriginal": "원문 보기",
|
||||
"records.hideOriginal": "원문 숨기기",
|
||||
"records.action.copyOriginal": "원문 복사",
|
||||
"records.action.copyFailed": "복사하지 못했습니다. 클립보드 접근이 막혀 있을 수 있습니다.",
|
||||
"records.action.removeTag": "#{{tag}} 태그 떼기",
|
||||
"records.deleteFailed": "기록을 삭제하지 못해 목록에 되돌려 놓았습니다. 다시 시도해 보세요.",
|
||||
"records.favoriteFailed": "즐겨찾기를 바꾸지 못했습니다. 다시 시도해 보세요.",
|
||||
"records.more": "더보기",
|
||||
"records.clearAllAction": "기록 모두 삭제",
|
||||
"records.clearAllTitle": "기록을 모두 삭제할까요?",
|
||||
"records.clearAllBody": "기록 {{count}}건이 모두 사라집니다. 기기 간 동기화를 켰다면 다른 기기에서도 지워집니다. 되돌릴 수 없습니다.",
|
||||
"records.clearAllIgnoresFilter": "지금 걸린 검색·필터와 상관없이 모든 기록을 지웁니다.",
|
||||
"records.clearAllConfirm": "모두 삭제",
|
||||
"records.clearAllDone": "기록을 모두 삭제했습니다.",
|
||||
"records.clearAllFailed": "기록을 모두 삭제하지 못했습니다. 다시 시도해 보세요.",
|
||||
"records.exportHint": "태그가 붙은 기록을 태그별 Markdown 파일로 저장합니다. 태그를 골랐으면 그 태그만 저장합니다.",
|
||||
"records.exportDone": "Markdown 파일로 저장했습니다: {{path}}",
|
||||
"records.exportFailed": "내보내지 못했습니다. 다시 시도해 보세요.",
|
||||
"license.section.plan": "요금제",
|
||||
"license.trial.title": "Pro+ 체험 중",
|
||||
"license.trial.remaining": "{{days}}일 남았습니다. 체험이 끝나면 무료 등급으로 바뀝니다.",
|
||||
"license.action.subscribePro": "Pro 구독",
|
||||
"license.action.subscribeProPlus": "Pro+ 구독",
|
||||
"license.action.upgradeProPlus": "Pro+로 업그레이드",
|
||||
"license.plan.active": "{{plan}}을 사용 중입니다.",
|
||||
"license.teamPlan": "팀 플랜",
|
||||
"license.enterprisePlan": "엔터프라이즈 플랜",
|
||||
"license.freePlan": "무료 플랜",
|
||||
"license.key.title": "라이선스 키",
|
||||
"license.key.desc": "발급받은 오프라인 라이선스 키(D3RO-LIC-…)를 붙여 넣고 등록하세요.",
|
||||
"license.key.activate": "등록",
|
||||
"license.key.deactivate": "해제",
|
||||
"license.key.activated": "라이선스 키를 등록했습니다.",
|
||||
"license.key.invalid": "라이선스 키를 확인하지 못했습니다. 발급받은 키 전체를 그대로 붙여 넣었는지 확인하세요.",
|
||||
"license.key.failed": "등록하지 못했습니다: {{error}}",
|
||||
"license.key.deactivated": "라이선스를 해제했습니다. 무료 등급으로 바뀌었습니다.",
|
||||
"license.quotaPerDay": "하루 {{limit}}회",
|
||||
"license.quotaPerWeek": "주 {{limit}}회",
|
||||
"cloudSync.account": "계정",
|
||||
"cloudSync.signInDesc": "Google 또는 GitHub 계정으로 로그인하면 동기화를 시작합니다.",
|
||||
"cloudSync.status": "동기화 상태",
|
||||
"support.title": "고객지원",
|
||||
"support.tab.faq": "자주 묻는 질문",
|
||||
"support.tab.contact": "문의하기",
|
||||
"support.faq.search": "질문 검색",
|
||||
"support.faq.empty": "일치하는 질문이 없습니다.",
|
||||
"support.faq.mic.q": "마이크 음성 인식이 작동하지 않거나 소리가 입력되지 않습니다.",
|
||||
"support.faq.mic.a": "1. Windows 설정 > 개인 정보 및 보안 > 마이크에서 \"데스크톱 앱이 마이크에 액세스하도록 허용\"이 켜져 있는지 확인하세요.\n2. D3RO Voice 설정 > 오디오 탭에서 실제로 쓰는 입력 마이크가 선택되었는지 확인하세요.\n3. 그래도 해결되지 않으면 \"문의하기\" 탭에서 이메일로 알려 주세요.",
|
||||
"support.faq.gpu.q": "NVIDIA CUDA GPU 가속을 어떻게 켜나요?",
|
||||
"support.faq.gpu.a": "NVIDIA 그래픽 카드와 CUDA 런타임이 준비되어 있으면 faster-whisper(CTranslate2) 엔진이 GPU를 감지해 GPU 모드로 동작합니다. 큰 모델일수록 VRAM이 더 필요합니다.",
|
||||
"support.faq.refund.q": "환불은 어떻게 요청하나요?",
|
||||
"support.faq.refund.a": "환불과 결제 취소는 구매 화면에 안내된 조건과 해당 결제 처리자(Google Play 등)의 정책을 따릅니다. 앱 안에서 자동으로 환불되지는 않습니다. \"문의하기\" 탭에서 \"결제 / 환불\" 분류로 이메일을 보내 주시면 확인 후 답변드립니다.",
|
||||
"support.faq.invoice.q": "법인 전자세금계산서 발행은 어떻게 요청하나요?",
|
||||
"support.faq.invoice.a": "\"문의하기\" 탭에서 \"결제 / 환불\" 분류로 사업자 정보와 결제 내역을 적어 이메일을 보내 주세요.",
|
||||
"support.category.audio": "마이크 / 오디오",
|
||||
"support.category.gpu": "CUDA GPU / 모델 로딩 오류",
|
||||
"support.category.billing": "결제 / 환불",
|
||||
"support.category.general": "기타 문의",
|
||||
"support.contact.intro": "문의는 이메일로 받습니다. 아래 내용을 채우고 버튼을 누르면 메일 앱에 초안이 열립니다. 메일 앱에서 직접 보내야 문의가 전달됩니다.",
|
||||
"support.contact.category": "분류",
|
||||
"support.contact.subject": "문의 제목",
|
||||
"support.contact.subjectPlaceholder": "문제를 한 줄로 요약해 주세요",
|
||||
"support.contact.details": "상세 내용",
|
||||
"support.contact.detailsPlaceholder": "어떤 상황에서 문제가 생겼는지 적어 주세요",
|
||||
"support.contact.required": "필수 항목입니다.",
|
||||
"support.contact.diagnostics": "메일에 함께 담기는 진단 정보",
|
||||
"support.contact.submit": "메일 앱에서 작성",
|
||||
"support.contact.opened": "메일 앱에 초안을 열었습니다. 메일 앱에서 보내기를 눌러야 문의가 전달됩니다.",
|
||||
"support.contact.openFailed": "메일 앱을 열지 못했습니다. 아래 주소로 직접 이메일을 보내 주세요.",
|
||||
"support.contact.address": "지원 이메일",
|
||||
"ads.label": "광고",
|
||||
"ads.testAd": "테스트 광고",
|
||||
"ads.learnMore": "자세히 보기",
|
||||
"ads.removeWithPro": "Pro로 광고 없애기",
|
||||
"ads.rewarded.title": "광고 보고 충전하기",
|
||||
"ads.rewarded.unavailableTitle": "볼 수 있는 광고가 없습니다",
|
||||
"ads.rewarded.checking": "확인된 광고를 찾는 중…",
|
||||
"ads.rewarded.notAvailable": "지금은 확인된 광고가 없습니다. 잠시 후 다시 시도하세요.",
|
||||
"ads.rewarded.unreachable": "광고 제공자에 연결하지 못했습니다. 인터넷 연결을 확인하고 다시 시도하세요.",
|
||||
"ads.rewarded.verifyFailed": "시청을 확인하지 못해 충전하지 않았습니다. 다시 시도하세요.",
|
||||
"ads.rewarded.verifyNote": "서버가 시청을 확인한 뒤에만 충전됩니다.",
|
||||
"ads.rewarded.ready": "시청 완료",
|
||||
"ads.rewarded.remaining": "{{seconds}}초 남음",
|
||||
"ads.rewarded.claim": "충전하기",
|
||||
"ads.rewarded.progress": "광고 재생 진행률",
|
||||
"onboarding.wizard.title": "D3RO Voice 시작하기",
|
||||
"onboarding.wizard.progress": "설정 진행",
|
||||
"onboarding.wizard.skip": "나중에 설정",
|
||||
"onboarding.wizard.skipHint": "건너뛰면 기본값(로컬 모드)으로 시작합니다. 설정 › 정보에서 이 안내를 다시 열 수 있습니다.",
|
||||
"onboarding.mode.intro": "음성 인식과 AI 처리를 어디서 할지 고르세요. 설정에서 언제든 바꿀 수 있습니다.",
|
||||
"onboarding.mode.local.title": "로컬 모드",
|
||||
"onboarding.mode.local.badge": "권장",
|
||||
"onboarding.mode.local.desc": "Ollama와 로컬 Whisper로 이 PC 안에서 음성 인식과 AI 다듬기를 합니다.",
|
||||
"onboarding.mode.local.point1": "인터넷 연결 없이 동작합니다",
|
||||
"onboarding.mode.local.point2": "음성 인식과 AI 처리가 이 PC 안에서 끝납니다",
|
||||
"onboarding.mode.local.point3": "API 요금이 없습니다 (Ollama 설치와 모델 다운로드 필요)",
|
||||
"onboarding.mode.local.action": "로컬 모드로 시작",
|
||||
"onboarding.mode.online.title": "온라인 모드",
|
||||
"onboarding.mode.online.desc": "D3RO 계정으로 로그인하면 서버의 음성 인식과 AI 모델을 씁니다.",
|
||||
"onboarding.mode.online.point1": "로컬 모델을 설치하지 않아도 됩니다",
|
||||
"onboarding.mode.online.point2": "기기 간 동기화를 쓸 수 있습니다",
|
||||
"onboarding.mode.online.point3": "D3RO 계정이 필요합니다",
|
||||
"onboarding.mode.online.action": "계정으로 로그인",
|
||||
"onboarding.local.connected": "Ollama에 연결됨",
|
||||
"onboarding.local.connectedVersion": "Ollama에 연결됨 (v{{version}})",
|
||||
"onboarding.local.disconnected": "Ollama에 연결되지 않음",
|
||||
"onboarding.local.connectedDetail": "설치된 모델 {{count}}개 · 사용 모델 {{model}}",
|
||||
"onboarding.local.disconnectedDetail": "Ollama가 설치되지 않았거나 실행 중이 아닙니다.",
|
||||
"onboarding.local.recheck": "다시 확인",
|
||||
"onboarding.local.start": "Ollama 실행",
|
||||
"onboarding.local.installTitle": "Ollama를 아직 설치하지 않았다면",
|
||||
"onboarding.local.installStep1": "1. ollama.com에서 Ollama를 내려받아 설치합니다.",
|
||||
"onboarding.local.installStep2": "2. 설치한 뒤 '다시 확인'을 누르면 D3RO Voice가 Ollama에 연결합니다.",
|
||||
"onboarding.local.openDownload": "ollama.com/download 열기",
|
||||
"onboarding.local.modelTitle": "기본 AI 모델 받기 ({{model}})",
|
||||
"onboarding.local.modelDesc": "받아쓰기 다듬기·요약·번역에 쓰는 기본 모델입니다. Ollama에 연결되면 받을 수 있습니다.",
|
||||
"onboarding.local.pull": "{{model}} 받기",
|
||||
"onboarding.local.modelReady": "AI 모델이 이미 설치되어 있습니다.",
|
||||
"onboarding.local.finish": "설정 마치기",
|
||||
"onboarding.local.finishHint": "Ollama에 연결되면 설정을 마칠 수 있습니다.",
|
||||
"onboarding.auth.intro": "D3RO 계정으로 로그인하면 온라인 모드로 시작합니다.",
|
||||
"onboarding.auth.email": "이메일",
|
||||
"onboarding.auth.password": "비밀번호",
|
||||
"onboarding.auth.submitLogin": "로그인",
|
||||
"onboarding.auth.submitRegister": "가입하기",
|
||||
"onboarding.auth.processing": "처리 중…",
|
||||
"onboarding.auth.failed": "로그인하지 못했습니다. 이메일과 비밀번호를 확인하세요.",
|
||||
"onboarding.auth.error": "로그인하지 못했습니다: {{message}}",
|
||||
"onboarding.done.title": "설정을 마쳤습니다",
|
||||
"onboarding.done.desc": "STT 공급자와 Ollama 모델은 설정 화면에서 바꿀 수 있습니다.",
|
||||
"onboarding.done.start": "시작하기",
|
||||
"onboarding.failedPhase": "설정하지 못했습니다. {{message}}",
|
||||
"ollamaGuide.start.running": "Ollama가 이미 실행 중입니다.",
|
||||
"ollamaGuide.start.starting": "Ollama 서버를 시작했습니다. 연결을 확인하는 중입니다.",
|
||||
"ollamaGuide.start.notInstalled": "Ollama가 설치되어 있지 않습니다. ollama.com에서 내려받아 설치하세요.",
|
||||
"ollamaGuide.start.failed": "Ollama를 실행하지 못했습니다. Ollama를 직접 실행한 뒤 '다시 확인'을 누르세요.",
|
||||
"ollamaGuide.title": "Ollama 설정",
|
||||
"ollamaGuide.status.connected": "Ollama에 연결됨",
|
||||
"ollamaGuide.status.connectedVersion": "Ollama에 연결됨 (v{{version}})",
|
||||
"ollamaGuide.status.disconnected": "Ollama에 연결되지 않음",
|
||||
"ollamaGuide.status.detail": "서버 {{url}} · 사용 모델 {{model}}",
|
||||
"ollamaGuide.recheck": "다시 확인",
|
||||
"ollamaGuide.start": "Ollama 실행",
|
||||
"ollamaGuide.starting": "실행 중…",
|
||||
"ollamaGuide.step1.title": "1. Ollama 설치와 실행",
|
||||
"ollamaGuide.step1.desc": "Ollama는 이 PC에서 LLM을 실행하는 무료 오픈소스 프로그램입니다. 설치한 뒤 실행하면 D3RO Voice가 연결합니다.",
|
||||
"ollamaGuide.step1.download": "ollama.com에서 내려받기",
|
||||
"ollamaGuide.step2.title": "2. 모델 받기",
|
||||
"ollamaGuide.step2.desc": "받아쓰기 다듬기·번역·요약에 쓸 모델을 받습니다. Ollama에 연결되어 있어야 받을 수 있습니다.",
|
||||
"ollamaGuide.step2.installedCount": "설치된 모델 {{count}}개",
|
||||
"ollamaGuide.model.recommended": "권장",
|
||||
"ollamaGuide.model.gemma4e4b": "이 앱의 기본 모델입니다. 추론(thinking) 토큰을 쓰지 않아 받아쓰기 다듬기 응답이 빠릅니다.",
|
||||
"ollamaGuide.model.llama32": "Meta의 경량 모델입니다. 문법 교정과 어조 조절에 씁니다.",
|
||||
"ollamaGuide.model.qwen25": "한국어를 포함한 여러 언어를 지원하는 경량 모델입니다.",
|
||||
"ollamaGuide.model.phi4": "요약·번역에 쓰는 큰 모델입니다. RAM 16GB 이상을 권장합니다.",
|
||||
"ollamaGuide.model.inUse": "사용 중",
|
||||
"ollamaGuide.model.select": "기본 모델로 선택",
|
||||
"ollamaGuide.model.pull": "받기",
|
||||
"ollamaGuide.model.pullAria": "{{model}} 받기",
|
||||
"ollamaGuide.terminalHint": "터미널에서 직접 받으려면 다음 명령을 실행하세요.",
|
||||
"ollamaGuide.step3.title": "3. 동작 확인",
|
||||
"ollamaGuide.step3.desc": "문장을 입력하고 실행하면 사용 중인 모델이 문장을 다듬어 돌려줍니다.",
|
||||
"ollamaGuide.test.sample": "안녕하세요 오늘의 날씨를 알려줘",
|
||||
"ollamaGuide.test.placeholder": "다듬을 문장 입력",
|
||||
"ollamaGuide.test.inputLabel": "테스트 문장",
|
||||
"ollamaGuide.test.run": "다듬기 실행",
|
||||
"ollamaGuide.test.running": "처리 중",
|
||||
"ollamaGuide.test.result": "다듬은 결과 ({{model}})",
|
||||
"ollamaGuide.test.noResponse": "모델이 응답하지 않았습니다.",
|
||||
"ollamaGuide.test.error": "실행하지 못했습니다: {{message}}",
|
||||
"ollamaGuide.footer": "Ollama를 쓰면 AI 처리가 이 PC 안에서 끝납니다.",
|
||||
"codexGuide.title": "OpenAI·Codex 연결 안내",
|
||||
"codexGuide.tab.apiKey": "OpenAI API 키",
|
||||
"codexGuide.tab.codex": "Codex·ChatGPT 구독",
|
||||
"codexGuide.tab.providers": "다른 STT 서비스 키",
|
||||
"codexGuide.apiKey.introTitle": "OpenAI API 키로 연결하기",
|
||||
"codexGuide.apiKey.introDesc": "OpenAI Whisper API는 사용한 시간만큼 분 단위로 요금이 청구되며, ChatGPT 구독과는 별도로 결제됩니다. 요금은 OpenAI 요금 페이지에서 확인하세요.",
|
||||
"codexGuide.apiKey.step1.title": "1. OpenAI Platform의 API Keys 페이지를 엽니다",
|
||||
"codexGuide.apiKey.step1.desc": "OpenAI 계정으로 로그인하면 API 키 목록이 보입니다.",
|
||||
"codexGuide.apiKey.step1.action": "API Keys 열기",
|
||||
"codexGuide.apiKey.step2.title": "2. 새 비밀 키를 만들고 복사합니다",
|
||||
"codexGuide.apiKey.step2.desc": "'Create new secret key'를 누르고 이름을 입력하면 sk-proj-로 시작하는 키가 만들어집니다.",
|
||||
"codexGuide.apiKey.step2.warning": "키는 만들 때 한 번만 보이므로 바로 복사하세요.",
|
||||
"codexGuide.apiKey.step3.title": "3. STT 설정에 붙여넣고 연결을 테스트합니다",
|
||||
"codexGuide.apiKey.step3.desc": "설정 › STT에서 OpenAI를 고르고 API 키 칸에 붙여넣은 뒤 '연결 테스트'를 누르면 키가 동작하는지 확인합니다.",
|
||||
"codexGuide.codex.introTitle": "ChatGPT Plus·Pro·Team 구독자 안내",
|
||||
"codexGuide.codex.introDesc": "ChatGPT 구독과 OpenAI Platform API는 서로 다른 계정 체계입니다. Codex CLI는 브라우저 OAuth(Device Flow)로 토큰을 받아 인증합니다.",
|
||||
"codexGuide.codex.step1.title": "1. 터미널에서 Device Auth 로그인을 실행합니다",
|
||||
"codexGuide.codex.step1.desc": "화면에 표시된 8자리 인증 코드를 브라우저 인증 페이지에 입력합니다.",
|
||||
"codexGuide.codex.step2.title": "2. 연결이 안 될 때",
|
||||
"codexGuide.codex.step2.proxy": "VPN이나 회사 프록시가 localhost 리디렉션을 막으면 --device-auth 옵션을 쓰세요.",
|
||||
"codexGuide.codex.step2.expired": "OAuth 토큰이 만료되면 다시 로그인하거나 API 키 방식을 쓰세요.",
|
||||
"codexGuide.copyCommand": "명령 복사",
|
||||
"codexGuide.providers.intro": "다음 서비스에서 API 키를 발급받아 STT 설정에 등록할 수 있습니다.",
|
||||
"codexGuide.providers.groq": "Groq 서버에서 Whisper Large V3를 실행합니다. 무료 사용 한도가 있습니다.",
|
||||
"codexGuide.providers.deepgram": "자동 문장부호와 서식을 지원합니다. 가입하면 무료 크레딧을 줍니다.",
|
||||
"codexGuide.providers.google": "Google AI Studio에서 API 키를 발급합니다.",
|
||||
"codexGuide.providers.assemblyai": "AssemblyAI 대시보드에서 API 키를 발급합니다.",
|
||||
"codexGuide.providers.open": "{{name}} 키 발급",
|
||||
"records.notFound": "이 기록을 찾을 수 없습니다. 이미 삭제되었을 수 있습니다.",
|
||||
"records.tags.filterAria": "태그로 거르기",
|
||||
"meetings.header.mic": "마이크 {{name}}",
|
||||
"meetings.header.engine": "음성 인식 {{name}}",
|
||||
"meetings.engine.local": "로컬 Whisper",
|
||||
"meetings.defaultMic": "기본 마이크",
|
||||
"meetings.starting": "준비 중…",
|
||||
"meetings.searchPlaceholder": "회의 제목 검색",
|
||||
"meetings.empty.title": "아직 회의가 없습니다",
|
||||
"meetings.empty.description": "회의를 녹음하면 전사가 남고, 요약과 문서를 만들 수 있습니다.",
|
||||
"meetings.noResults.title": "일치하는 회의가 없습니다",
|
||||
"meetings.noResults.description": "제목으로만 찾습니다. 다른 검색어를 써 보세요.",
|
||||
"meetings.noResults.partial": "불러온 회의 {{count}}건에서는 찾지 못했습니다. 이전 회의를 더 불러와 찾아보세요.",
|
||||
"meetings.loadMore": "더 불러오기",
|
||||
"meetings.loadingMore": "불러오는 중",
|
||||
"meetings.shown": "{{total}}건 중 {{shown}}건",
|
||||
"meetings.loadError.title": "회의 목록을 불러오지 못했습니다",
|
||||
"meetings.loadError.description": "회의 저장소를 읽는 중 문제가 생겼습니다. 다시 시도하고, 계속되면 앱을 다시 시작하세요.",
|
||||
"meetings.loadMoreError": "다음 회의를 불러오지 못했습니다.",
|
||||
"meetings.memoCount": "메모 {{count}}",
|
||||
"meetings.status.recording": "녹음 중",
|
||||
"meetings.status.processing": "저장 중",
|
||||
"meetings.status.error": "오류",
|
||||
"meetings.status.completed": "완료",
|
||||
"meetings.more": "더 보기",
|
||||
"meetings.rename": "제목 변경",
|
||||
"meetings.renameDialog.title": "회의 제목 변경",
|
||||
"meetings.renameDialog.label": "제목",
|
||||
"meetings.renameFailed": "제목을 바꾸지 못했습니다: {{message}}",
|
||||
"meetings.delete.title": "‘{{title}}’ 회의를 삭제할까요?",
|
||||
"meetings.delete.body": "전사, 회의 메모, 문서, 녹음 파일이 함께 삭제됩니다. 동기화된 다른 기기에서도 사라지며 되돌릴 수 없습니다.",
|
||||
"meetings.deleted": "회의를 삭제했습니다.",
|
||||
"meetings.deleteFailed": "회의를 삭제하지 못했습니다: {{message}}",
|
||||
"meetings.live.title": "회의 녹음",
|
||||
"meetings.live.stopping": "종료하는 중",
|
||||
"meetings.live.stopFailed": "녹음을 멈추지 못했습니다: {{message}}",
|
||||
"meetings.live.transcript": "실시간 전사",
|
||||
"meetings.live.editHint": "지난 문장을 누르면 바로 고칠 수 있습니다",
|
||||
"meetings.live.segmentCount": "{{count}}문장",
|
||||
"meetings.live.waiting": "말하기 시작하면 전사가 여기에 나타납니다.",
|
||||
"meetings.live.editFailed": "전사 수정을 저장하지 못했습니다: {{message}}",
|
||||
"meetings.live.memoTitle": "회의 메모",
|
||||
"meetings.live.memoHint": "메모는 녹음 시각과 함께 저장되고, 요약을 만들 때 먼저 반영됩니다.",
|
||||
"meetings.live.memoPlaceholder": "메모 입력 후 Enter",
|
||||
"meetings.live.memoFailed": "메모를 저장하지 못했습니다: {{message}}",
|
||||
"meetings.live.level": "입력 레벨",
|
||||
"meetings.live.elapsed": "경과 시간",
|
||||
"meetings.tag.decision": "#결정",
|
||||
"meetings.tag.todo": "#할일",
|
||||
"meetings.tag.agenda": "#안건",
|
||||
"meetings.tag.idea": "#아이디어",
|
||||
"meetings.tag.issue": "#이슈",
|
||||
"meetings.detail.back": "회의 목록",
|
||||
"meetings.detail.copySummary": "요약 복사",
|
||||
"meetings.detail.copyTranscript": "전사 복사",
|
||||
"meetings.detail.summaryCopied": "요약을 복사했습니다.",
|
||||
"meetings.detail.transcriptCopied": "전사를 복사했습니다.",
|
||||
"meetings.detail.copyFailed": "클립보드에 복사하지 못했습니다.",
|
||||
"meetings.export.label": "내보내기",
|
||||
"meetings.export.summaryGroup": "요약",
|
||||
"meetings.export.transcriptGroup": "전사",
|
||||
"meetings.export.noSummary": "요약을 만든 뒤 내보낼 수 있습니다",
|
||||
"meetings.export.done": "저장했습니다: {{path}}",
|
||||
"meetings.export.failed": "내보내지 못했습니다: {{message}}",
|
||||
"meetings.format.md": "Markdown (.md)",
|
||||
"meetings.format.txt": "텍스트 (.txt)",
|
||||
"meetings.format.pdf": "PDF (.pdf)",
|
||||
"meetings.format.docx": "Word (.docx)",
|
||||
"meetings.tabs.label": "회의 내용",
|
||||
"meetings.tab.summary": "요약",
|
||||
"meetings.tab.transcript": "전사",
|
||||
"meetings.tab.documents": "문서",
|
||||
"meetings.tab.notes": "내 메모",
|
||||
"meetings.ask": "질문하기",
|
||||
"meetings.askClose": "질문 닫기",
|
||||
"meetings.askSend": "보내기",
|
||||
"meetings.summary.empty.title": "아직 요약이 없습니다",
|
||||
"meetings.summary.empty.description": "전사를 바탕으로 핵심 요약, 결정 사항, 할 일을 정리합니다.",
|
||||
"meetings.summary.empty.noTranscript": "전사가 없어 요약을 만들 수 없습니다.",
|
||||
"meetings.summary.create": "요약 만들기",
|
||||
"meetings.summary.creating": "요약을 만드는 중…",
|
||||
"meetings.summary.chooseTemplate": "다른 형식으로 만들기",
|
||||
"meetings.summary.edit": "문서에서 편집",
|
||||
"meetings.summary.actionItems": "할 일",
|
||||
"meetings.summary.copyActionItems": "할 일 복사",
|
||||
"meetings.summary.actionItemsCopied": "할 일을 복사했습니다.",
|
||||
"meetings.summary.decisions": "결정 사항",
|
||||
"meetings.summary.generateFailed": "문서를 만들지 못했습니다: {{message}}",
|
||||
"meetings.doc.new": "새 문서",
|
||||
"meetings.doc.untitled": "문서 {{n}}",
|
||||
"meetings.doc.list": "문서 목록",
|
||||
"meetings.doc.primaryHint": "첫 문서가 요약 탭에 보입니다.",
|
||||
"meetings.doc.empty.title": "문서가 없습니다",
|
||||
"meetings.doc.empty.description": "회의록, 보고서, 아이디어 노트 같은 형식을 골라 전사로 문서를 만듭니다.",
|
||||
"meetings.doc.delete.title": "‘{{title}}’ 문서를 삭제할까요?",
|
||||
"meetings.doc.delete.body": "이 문서만 삭제되며 되돌릴 수 없습니다. 전사와 회의 메모는 남습니다.",
|
||||
"meetings.doc.deleted": "문서를 삭제했습니다.",
|
||||
"meetings.notes.recordedTitle": "녹음 중 남긴 메모",
|
||||
"meetings.notes.padTitle": "내 메모",
|
||||
"meetings.notes.padHint": "이 기기에 자동 저장됩니다. 다른 기기와는 동기화되지 않습니다.",
|
||||
"meetings.notes.placeholder": "논의한 내용, 고객 피드백, 내가 할 일을 자유롭게 적으세요.",
|
||||
"meetings.notes.enhance": "메모로 회의록 만들기",
|
||||
"meetings.notes.enhancing": "만드는 중…",
|
||||
"meetings.notes.enhanceHint": "내 메모와 전사를 합쳐 새 문서를 만듭니다.",
|
||||
"meetings.notes.enhancedDocTitle": "내 메모로 정리한 회의록",
|
||||
"meetings.notes.saveFailed": "메모를 이 기기에 저장하지 못했습니다. 저장 공간을 확인하세요.",
|
||||
"meetings.transcript.empty": "전사된 내용이 없습니다.",
|
||||
"meetings.transcript.memo": "메모",
|
||||
"meetings.error.reason": "원인",
|
||||
"meetings.error.fix": "해결 방법",
|
||||
"meetings.error.openAudioSettings": "오디오 설정 열기",
|
||||
"meetings.error.openSttSettings": "음성 인식 설정 열기",
|
||||
"meetings.error.forceStart": "진행 중인 세션을 정리하고 시작",
|
||||
"meetings.error.forceRetry": "초기화 후 다시 시도",
|
||||
"meetings.error.collision.title": "다른 회의나 실시간 자막이 아직 실행 중입니다",
|
||||
"meetings.error.collision.message": "이전 회의 세션이나 자막이 백그라운드에서 계속 실행 중입니다.",
|
||||
"meetings.error.collision.reason": "이전 회의·자막 프로세스가 완전히 끝나지 않아 새 녹음과 부딪혔습니다.",
|
||||
"meetings.error.collision.suggestion": "실행 중인 세션을 정리하면 바로 새 회의를 시작할 수 있습니다.",
|
||||
"meetings.error.stt.title": "음성 인식(STT) 엔진을 준비하지 못했습니다",
|
||||
"meetings.error.stt.message": "음성 인식 엔진이나 Whisper 모델을 불러오지 못했습니다.",
|
||||
"meetings.error.stt.reason": "로컬 Whisper 모델 파일이 준비되지 않았거나 사이드카 프로세스 포트가 사용 중입니다.",
|
||||
"meetings.error.stt.suggestion": "음성 인식 설정에서 모델 다운로드 상태를 확인하거나, 초기화 후 다시 시도하세요.",
|
||||
"meetings.error.audio.title": "마이크 녹음을 시작하지 못했습니다",
|
||||
"meetings.error.audio.message": "마이크 오디오 스트림을 열 수 없습니다.",
|
||||
"meetings.error.audio.reason": "기본 마이크를 찾을 수 없거나 Windows 마이크 권한이 꺼져 있습니다.",
|
||||
"meetings.error.audio.suggestion": "오디오 설정에서 마이크를 고르거나, 기본 장치로 다시 시도하세요.",
|
||||
"meetings.error.processing.title": "회의를 저장하지 못했습니다",
|
||||
"meetings.error.processing.message": "녹음을 마친 뒤 전사를 저장하는 중 오류가 났습니다.",
|
||||
"meetings.error.processing.reason": "녹음 종료 후 회의 기록을 데이터베이스에 쓰지 못했습니다.",
|
||||
"meetings.error.processing.suggestion": "실패한 회의는 목록에 오류 상태로 남습니다. 디스크 공간을 확인한 뒤 목록에서 그 회의를 열어 확인하세요.",
|
||||
"meetings.error.general.title": "회의를 시작할 수 없습니다",
|
||||
"meetings.error.general.message": "알 수 없는 오류로 회의 녹음을 시작하지 못했습니다.",
|
||||
"meetings.error.general.reason": "백그라운드 통신이나 초기화 중 문제가 생겼습니다.",
|
||||
"meetings.error.general.suggestion": "초기화한 뒤 다시 시작해 보세요.",
|
||||
"popup.result.title": "입력하지 못했습니다 · 복사해서 붙여넣으세요",
|
||||
"popup.copied": "복사함",
|
||||
"popup.hints.move": "이동",
|
||||
"popup.hints.paste2": "붙여넣기",
|
||||
"popup.hints.apply2": "적용",
|
||||
"popup.hints.close2": "닫기",
|
||||
"popup.hints.pick": "번호로 고르기",
|
||||
"popup.history.title": "최근 받아쓰기",
|
||||
"popup.history.empty": "아직 받아쓴 글이 없습니다.",
|
||||
"popup.command.title": "명령 고르기",
|
||||
"popup.command.empty": "만든 명령이 없습니다.",
|
||||
"popup.command.none": "명령 없이 원문 넣기",
|
||||
"settings.closeToTray.desc": "창을 닫아도 트레이에서 계속 실행되어 단축키가 동작합니다.",
|
||||
"settings.autoLaunch.desc": "컴퓨터에 로그인하면 D3RO Voice를 시작합니다.",
|
||||
"settings.autoInsert.desc": "전사가 끝나면 커서가 있는 앱에 텍스트를 바로 넣습니다.",
|
||||
"settings.soundEffects.desc": "녹음을 시작하고 끝낼 때 소리로 알립니다.",
|
||||
"settings.micTest": "마이크 테스트",
|
||||
"settings.micTest.desc": "테스트를 누르고 말하면 막대가 움직입니다. 움직이지 않으면 다른 입력 장치를 고르세요.",
|
||||
"settings.micTest.level": "입력 레벨",
|
||||
"settings.micTest.failed": "마이크를 열지 못했습니다. 다른 앱이 마이크를 쓰고 있는지, Windows 마이크 권한이 켜져 있는지 확인하세요.",
|
||||
"settings.llm.engineSection": "AI 처리 엔진",
|
||||
"settings.llm.engine": "처리 위치",
|
||||
"settings.llm.engine.desc": "받아쓰기 다듬기·요약·명령어를 어디서 처리할지 고릅니다.",
|
||||
"settings.llm.engine.local": "로컬 Ollama — 이 PC에서 실행, 인터넷 없이 동작",
|
||||
"settings.llm.engine.online": "D3RO 온라인 API — 로그인 필요",
|
||||
"settings.llm.ollamaStatus": "Ollama 연결",
|
||||
"settings.llm.ollamaChecking": "연결을 확인하는 중",
|
||||
"settings.llm.ollamaConnected": "연결됨 · 설치된 모델 {{count}}개",
|
||||
"settings.llm.ollamaConnectedVersion": "연결됨 · v{{version}} · 설치된 모델 {{count}}개",
|
||||
"settings.llm.ollamaOffline": "연결되지 않음 — Ollama 서버를 실행해야 로컬 AI 처리가 동작합니다.",
|
||||
"settings.llm.checkConnection": "연결 확인",
|
||||
"settings.llm.startOllama": "Ollama 실행",
|
||||
"settings.llm.startingOllama": "실행하는 중",
|
||||
"settings.llm.guide": "설치와 모델",
|
||||
"settings.llm.guide.desc": "Ollama 설치 방법과 받을 수 있는 모델을 안내합니다.",
|
||||
"settings.llm.openGuide": "안내 열기",
|
||||
"settings.llm.feedback.running": "Ollama가 이미 실행 중입니다.",
|
||||
"settings.llm.feedback.started": "Ollama 서버를 시작했습니다. 잠시 후 연결을 다시 확인합니다.",
|
||||
"settings.llm.feedback.notInstalled": "Ollama가 설치되어 있지 않습니다. 설치 안내를 열어 설치하세요.",
|
||||
"settings.llm.feedback.failed": "Ollama를 실행하지 못했습니다. 설치 안내를 확인하세요.",
|
||||
"settings.llm.serverUrl.desc": "Ollama가 다른 주소에서 실행 중일 때만 바꿉니다.",
|
||||
"settings.llm.activeModel": "사용할 모델",
|
||||
"settings.llm.activeModel.desc": "다듬기·요약·대화에 쓰는 Ollama 모델입니다.",
|
||||
"settings.llm.modelRecommended": "{{name}} (권장 · 설치 안 됨)",
|
||||
"settings.llm.modelNotInstalled": "{{name}} (설치 안 됨)",
|
||||
"settings.llm.onlineUrl": "API 서버 URL",
|
||||
"settings.llm.account": "계정",
|
||||
"settings.llm.accountSignedIn": "{{email}}(으)로 로그인됨",
|
||||
"settings.llm.accountSignedInNoEmail": "로그인됨",
|
||||
"settings.llm.accountSignedOut": "로그인하지 않음 — 라이선스 탭에서 로그인해야 온라인 API를 쓸 수 있습니다.",
|
||||
"settings.about.appName": "D3RO Voice",
|
||||
"settings.about.summary": "음성 인식과 AI 처리를 이 PC에서 실행하는 음성 어시스턴트입니다. 온라인 API와 기기 간 동기화는 켠 경우에만 인터넷을 씁니다.",
|
||||
"settings.about.helpSection": "도움말",
|
||||
"settings.about.restartOnboarding.desc": "처음 실행할 때 본 안내를 다시 엽니다. 앱 화면이 새로 고쳐집니다.",
|
||||
"settings.about.restartOnboarding.action": "안내 열기",
|
||||
"settings.stt.engineSection": "음성 인식 엔진",
|
||||
"settings.stt.openGuide": "OpenAI · Codex 연결 안내",
|
||||
"settings.stt.engine": "엔진",
|
||||
"settings.stt.provider.local.desc": "이 PC에서 Whisper로 인식합니다. 인터넷 없이 동작하고 오디오를 밖으로 보내지 않습니다.",
|
||||
"settings.stt.provider.d3roCloud.desc": "D3RO 서버에서 인식합니다. D3RO 계정으로 인증하므로 API 키가 필요 없습니다.",
|
||||
"settings.stt.provider.openai.desc": "오디오를 OpenAI 서버로 보내 인식합니다. OpenAI API 키가 필요합니다.",
|
||||
"settings.stt.provider.groq.desc": "오디오를 Groq 서버로 보내 인식합니다. 응답이 빠르고 Groq API 키가 필요합니다.",
|
||||
"settings.stt.provider.deepgram.desc": "오디오를 Deepgram 서버로 보내 인식합니다. 문장 부호와 서식을 자동으로 넣습니다. API 키가 필요합니다.",
|
||||
"settings.stt.provider.assemblyai.desc": "오디오를 AssemblyAI 서버로 보내 인식합니다. API 키가 필요합니다.",
|
||||
"settings.stt.provider.google.desc": "오디오를 Google Gemini로 보내 인식합니다. 한국어를 포함한 여러 언어를 지원합니다. API 키가 필요합니다.",
|
||||
"settings.stt.provider.custom.desc": "OpenAI 호환 엔드포인트(vLLM, 사내 서버 등)로 보냅니다. 주소는 고급에서 넣습니다.",
|
||||
"settings.stt.modelInstalled": "설치됨",
|
||||
"settings.stt.modelNotDownloaded": "받지 않음",
|
||||
"settings.stt.modelNeedsDownload": "{{name}} 모델을 아직 받지 않았습니다 · 약 {{size}} MB",
|
||||
"settings.stt.downloadModel": "모델 받기",
|
||||
"settings.stt.downloading": "받는 중 {{percent}}%",
|
||||
"settings.stt.runtime.sidecar": "로컬 음성 엔진 (faster-whisper)",
|
||||
"settings.stt.runtime.ffmpeg": "미디어 변환기 (ffmpeg)",
|
||||
"settings.stt.runtime.installed": "설치됨 · {{size}} MB",
|
||||
"settings.stt.runtime.missing": "설치되지 않음 — 로컬 전사에 필요합니다",
|
||||
"settings.stt.runtime.install": "내려받기",
|
||||
"settings.stt.runtime.reinstall": "다시 설치",
|
||||
"settings.stt.apiKey": "API 키",
|
||||
"settings.stt.apiKey.desc": "{{name}}에서 발급한 키를 붙여 넣으세요. 연결 테스트로 키가 맞는지 확인할 수 있습니다.",
|
||||
"settings.stt.apiKeyPlaceholder": "API 키 붙여 넣기",
|
||||
"settings.stt.account": "D3RO 계정",
|
||||
"settings.stt.account.desc": "로그인한 D3RO 계정으로 인증합니다. 연결 테스트로 사용할 수 있는지 확인하세요.",
|
||||
"settings.stt.showKey": "키 보기",
|
||||
"settings.stt.hideKey": "키 숨기기",
|
||||
"settings.stt.testConnection": "연결 테스트",
|
||||
"settings.stt.testing": "테스트하는 중",
|
||||
"settings.stt.languageSection": "언어",
|
||||
"settings.stt.advancedSection": "고급",
|
||||
"settings.stt.advanced.desc": "모델 ID · 엔드포인트 · 실패 시 전환",
|
||||
"settings.stt.advanced.show": "펼치기",
|
||||
"settings.stt.advanced.hide": "접기",
|
||||
"settings.stt.modelId": "모델 ID",
|
||||
"settings.stt.modelId.desc": "기본값: {{model}}",
|
||||
"settings.stt.modelId.auto": "자동",
|
||||
"settings.stt.baseUrl": "API 엔드포인트 URL",
|
||||
"settings.stt.baseUrl.desc": "프록시나 사내 서버를 쓸 때만 바꿉니다.",
|
||||
"tools.builtin": "기본 제공",
|
||||
"tools.editItem": "{{name}} 편집",
|
||||
"tools.deleteItem": "{{name}} 삭제",
|
||||
"tools.deleteFailed": "삭제하지 못했습니다. 항목을 되돌렸습니다 — 잠시 뒤 다시 시도하세요.",
|
||||
"tools.copyFailed": "복사하지 못했습니다. 클립보드 권한을 확인하세요.",
|
||||
"tools.loadMore": "더 보기 ({{shown}}/{{total}})",
|
||||
"tools.commands.description": "받아쓴 문장을 AI가 어떻게 다듬을지 고릅니다.",
|
||||
"tools.commands.add": "명령 추가",
|
||||
"tools.commands.listTitle": "사용할 명령",
|
||||
"tools.commands.listHint": "하나를 고르면 다음 받아쓰기부터 적용됩니다.",
|
||||
"tools.commands.none": "AI 명령 사용 안 함",
|
||||
"tools.commands.noneHint": "받아쓴 문장을 그대로 넣습니다.",
|
||||
"tools.commands.inUse": "사용 중",
|
||||
"tools.commands.empty": "만든 명령이 없습니다",
|
||||
"tools.commands.emptyHint": "명령 추가를 눌러 자주 쓰는 다듬기 방식을 저장하세요.",
|
||||
"tools.commands.loadFailed": "명령 목록을 불러오지 못했습니다.",
|
||||
"tools.commands.selectFailed": "명령을 바꾸지 못했습니다. 이전 설정으로 되돌렸습니다.",
|
||||
"tools.commands.deleted": "'{{name}}' 명령을 삭제했습니다.",
|
||||
"tools.commands.action.expand": "늘려 쓰기",
|
||||
"tools.commands.action.chain": "체인",
|
||||
"tools.commands.pipeline.current": "지금 받아쓰기 후처리:",
|
||||
"tools.commands.pipeline.missing": "명령이 선택되지 않음",
|
||||
"tools.commands.pipeline.stepsLabel": "받아쓰기 단계",
|
||||
"tools.commands.pipeline.stepStt": "음성을 글로 옮깁니다. 사전 단어를 인식 힌트로 씁니다.",
|
||||
"tools.commands.pipeline.stepRaw": "AI 후처리 없이 그대로 둡니다.",
|
||||
"tools.commands.pipeline.stepInstruction": "AI가 '{{name}}' 명령으로 다듬습니다.",
|
||||
"tools.commands.pipeline.stepMissing": "명령을 쓰도록 설정됐지만 고른 명령이 없습니다 — 아래에서 하나를 고르세요.",
|
||||
"tools.commands.pipeline.stepAction": "AI가 기본 후처리({{action}})를 적용합니다. 설정 > LLM에서 바꿀 수 있습니다.",
|
||||
"tools.commands.pipeline.stepInsert": "결과를 지금 쓰던 창에 넣습니다.",
|
||||
"tools.commands.test.title": "명령 시험하기",
|
||||
"tools.commands.test.description": "받아쓰기와 같은 경로로 문장 하나를 처리해 결과를 미리 봅니다.",
|
||||
"tools.commands.test.placeholder": "받아쓴 것처럼 문장을 입력하세요",
|
||||
"tools.commands.test.inputLabel": "시험할 문장",
|
||||
"tools.commands.test.run": "실행",
|
||||
"tools.commands.test.running": "실행 중…",
|
||||
"tools.commands.test.result": "결과",
|
||||
"tools.commands.test.failed": "처리하지 못했습니다: {{reason}}",
|
||||
"tools.commands.test.blockedRaw": "AI 후처리를 쓰지 않는 설정이라 결과가 입력과 같습니다.",
|
||||
"tools.commands.test.blockedChain": "체인은 여러 단계를 거치므로 여기서 시험할 수 없습니다.",
|
||||
"tools.commands.test.blockedMissing": "먼저 사용할 명령을 고르세요.",
|
||||
"tools.templates.description": "항목을 차례로 불러 주면 정해진 양식으로 채워 넣습니다.",
|
||||
"tools.templates.emptyHint": "새 템플릿을 눌러 자주 쓰는 양식을 만드세요.",
|
||||
"tools.templates.fieldCount": "필드 {{count}}개",
|
||||
"tools.templates.lastOutput": "마지막 결과",
|
||||
"tools.templates.deleted": "'{{name}}' 템플릿을 삭제했습니다.",
|
||||
"tools.templates.startItem": "{{name}} 시작",
|
||||
"tools.templates.removeField": "{{n}}번 필드 삭제",
|
||||
"tools.dictionary.description": "받아쓰기가 이 단어들을 먼저 알아듣도록 인식 힌트로 씁니다(최대 50개).",
|
||||
"tools.dictionary.add": "단어 추가",
|
||||
"tools.dictionary.search": "단어 검색",
|
||||
"tools.dictionary.empty": "등록한 단어가 없습니다",
|
||||
"tools.dictionary.emptyHint": "이름·전문 용어처럼 자주 틀리게 받아써지는 단어를 추가하세요.",
|
||||
"tools.dictionary.noResultsHint": "다른 검색어로 찾아보세요.",
|
||||
"tools.dictionary.loadFailed": "사전을 불러오지 못했습니다.",
|
||||
"tools.dictionary.deleted": "'{{word}}'을(를) 삭제했습니다.",
|
||||
"tools.dictionary.pronunciationValue": "발음 {{value}}",
|
||||
"tools.dictionary.pronunciationHelp": "예: 디쓰리오 — 지금은 참고용으로 저장되며, 인식 힌트에는 단어만 쓰입니다.",
|
||||
"tools.dictionary.formatJson": "JSON 파일",
|
||||
"tools.dictionary.formatCsv": "CSV 파일",
|
||||
"tools.knowledge.description": "추가한 문서에 질문하면 관련 부분을 찾아 답합니다. 문서는 이 기기에서 색인됩니다.",
|
||||
"tools.knowledge.ask": "질문",
|
||||
"tools.knowledge.examples": "예시",
|
||||
"tools.knowledge.example.summary": "이 문서들의 핵심 내용을 세 줄로 요약해 줘",
|
||||
"tools.knowledge.example.schedule": "주요 일정과 마일스톤을 정리해 줘",
|
||||
"tools.knowledge.example.policy": "보안·개인정보 관련 정책은 뭐야?",
|
||||
"tools.knowledge.answer": "답변",
|
||||
"tools.knowledge.similarity": "유사도 {{percent}}%",
|
||||
"tools.knowledge.queryFailed": "답을 찾지 못했습니다. 문서 색인 상태와 AI 연결을 확인하고 다시 질문하세요.",
|
||||
"tools.knowledge.queryNeedsDocs": "먼저 문서를 추가하면 질문할 수 있습니다",
|
||||
"tools.knowledge.chunkProgress": "청크 {{current}}/{{total}} · {{percent}}%",
|
||||
"tools.knowledge.chunkCount": "청크 {{count}}개",
|
||||
"tools.knowledge.notIndexed": "색인 안 됨",
|
||||
"tools.knowledge.reindexItem": "{{name}} 다시 색인",
|
||||
"tools.knowledge.deleted": "'{{name}}' 문서를 삭제했습니다.",
|
||||
"tools.knowledge.loadFailed": "문서 목록을 불러오지 못했습니다.",
|
||||
"tools.knowledge.emptyHint": "TXT·MD·PDF·DOCX 문서를 추가하면 내용에 질문할 수 있습니다.",
|
||||
"tools.insights.loadFailed": "입력 수집 상태를 불러오지 못했습니다.",
|
||||
"tools.insights.openSettings": "입력 설정 열기",
|
||||
"tools.conversation.description": "말하거나 입력해 AI와 대화합니다.",
|
||||
"tools.conversation.modeRealtime": "실시간 모드",
|
||||
"tools.conversation.start": "대화 시작",
|
||||
"tools.conversation.finish": "말하기 끝내고 보내기",
|
||||
"tools.conversation.stop": "대화 멈추기",
|
||||
"tools.conversation.cancelResponse": "응답 취소",
|
||||
"tools.conversation.send": "보내기",
|
||||
"tools.conversation.clearTitle": "대화 기록을 지울까요?",
|
||||
"tools.conversation.clearBody": "메시지 {{count}}개가 모두 지워지며 되돌릴 수 없습니다.",
|
||||
"tools.conversation.clearConfirm": "지우기",
|
||||
"tools.conversation.clearFailed": "대화 기록을 지우지 못했습니다. 다시 시도하세요."
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue