* feat(capsule): 录音胶囊样式可选——流光 Siri 风格 / Openless 默认风格 设置 → 录音与输入新增「胶囊样式」下拉(保留显示开关): - UserPreferences.capsule_style('siri' 默认 / 'classic')随 capsule:state payload 下发,切换后下一次录音即生效 - Capsule.tsx 双样式分支:siri 保留 SiriGL 光效舞台;classic 恢复 1.3.14 经典毛玻璃药丸(音量条 + 取消/确认按钮 + thinking 扫光 + 翻译徽章), 取消/确认改走 lib/ipc/dictation.ts,退出动画时长按样式区分 - 预览支持 ?style=classic;i18n 五语言新增胶囊样式文案 * fix(settings): 选区润色行适配重构后的 ShortcutRecorder props beta HEAD 在快捷键录入交互重构(e12c8dcc)合并后遗留的构建破坏: SelectionPolishSection 仍传已删除的 alignRecordButton / modifierPresets, tsc 直接报错。改为新 API(value 可空 + onReset 恢复默认快捷键, 等价于旧「启用」按钮),恢复 beta 可构建状态。 * fix(capsule): 评审修复——经典药丸按钮可点 + 音频线程零偏好锁 - 经典样式(Openless 默认)下胶囊窗口长期 set_ignore_cursor_events(true) (纯光效舞台时代遗留),✕/✓ 按钮实际不可点。现在主线程闭包按 「classic && visible && 非选区润色 && 录音/转写/润色中」关闭鼠标穿透, 终态 toast / 隐藏 / Siri / 选区润色保持穿透;值不变时不重复调用 set_ignore_cursor_events - emit_capsule 在音频回调线程 ~30Hz 被调,原先直接读 prefs(整份克隆 + 偏好锁被 set() 跨磁盘 I/O 持有)。改为 Inner 上 AtomicU8 样式缓存, 主线程闭包每帧从 prefs 同步(与 show_capsule 同源读取),音频线程零开销 - 恢复「录音胶囊」行的 desc 文案(beta 原有,重构时被误删) - Capsule.tsx 退出动画注释同步为按样式区分的常量名 * docs(capsule): 注明入场帧 payload 可能滞后一帧样式(防误改回音频线程读 prefs) --------- Co-authored-by: sim <sim@local>
1377 lines
76 KiB
TypeScript
1377 lines
76 KiB
TypeScript
import type { zhCN } from './zh-CN';
|
||
import { en } from './en';
|
||
|
||
// 한국어 (Beta) — AI 기계 번역 기반. 원어민 검토를 권장합니다.
|
||
// 구조는 zh-CN.ts 를 따릅니다. 새 key 를 추가할 때 ja.ts / ko.ts 도 동시에
|
||
// 갱신해 주세요(갱신되지 않은 key 는 ...en 으로 영어로 fallback 됩니다).
|
||
export const ko: typeof zhCN = {
|
||
...en,
|
||
app: {
|
||
name: 'OpenLess',
|
||
tagline: '자연스럽게 말하고, 정확하게 작성하세요',
|
||
},
|
||
common: {
|
||
loading: '로딩 중…',
|
||
retry: '다시 시도',
|
||
settingsLoadFailed: '설정 로드 실패',
|
||
refresh: '새로고침',
|
||
clear: '지우기',
|
||
copy: '복사',
|
||
delete: '삭제',
|
||
later: '나중에',
|
||
cancel: '취소',
|
||
close: '닫기',
|
||
show: '표시',
|
||
hide: '숨기기',
|
||
saved: '저장됨',
|
||
saving: '저장 중',
|
||
copied: '복사됨',
|
||
operationFailed: '작업 실패',
|
||
add: '추가',
|
||
durationSeconds: '{{value}}초',
|
||
durationMillis: '{{value}}ms',
|
||
durationMinutes: '{{value}}분',
|
||
},
|
||
capsule: {
|
||
thinking: 'thinking',
|
||
using: 'using',
|
||
cancelled: '취소됨',
|
||
error: '오류 발생',
|
||
inserted: '{{count}}자 입력됨',
|
||
translating: '번역 중',
|
||
selectionPolish: {
|
||
polishing: '다듬는 중...',
|
||
replaced: '교체됨',
|
||
noSelection: '선택된 내용 없음',
|
||
failed: '다듬기 실패, 다시 시도하세요',
|
||
},
|
||
},
|
||
selectionPolishPreview: {
|
||
title: '선택 영역 다듬기 미리보기',
|
||
subtitle: '편집 가능합니다. 확인을 클릭한 뒤에만 원래 선택 영역을 교체합니다.',
|
||
cancel: '취소',
|
||
resultLabel: '다듬기 결과',
|
||
sourcePrefix: '원문: ',
|
||
applyError: '적용하지 못했습니다: ',
|
||
confirmReplace: '확인 후 교체',
|
||
},
|
||
qa: {
|
||
title: '질문',
|
||
headerHint: '언제든 질문하세요',
|
||
thinking: '생각 중…',
|
||
error: '오류가 발생했습니다. 잠시 후 다시 시도해 주세요.',
|
||
errorRetry: '재시도',
|
||
errorRetryHint: '다시 시도해 주세요.',
|
||
pinTooltip: '고정(자동으로 닫히지 않음)',
|
||
unpinTooltip: '고정 해제',
|
||
closeTooltip: '닫기',
|
||
micLabel: '음성으로 질문',
|
||
micStop: '녹음 종료',
|
||
selectionPreview: '선택된 텍스트 기반:',
|
||
linuxSelectionToolsMissing: 'Linux 선택 영역을 읽으려면 wl-paste, xclip 또는 xsel 중 하나를 설치하세요.',
|
||
emptyTitle: '무엇을 도와드릴까요?',
|
||
emptyDesc: '텍스트를 선택해 질문하거나 아래에 직접 입력하세요. 답변이 여기에 표시되며 계속 이어서 질문할 수 있습니다.',
|
||
recordingHint: '녹음 중… {{recordHotkey}} 를 다시 눌러 종료하고 질문',
|
||
mobileRecordLabel: '녹음 버튼',
|
||
mobileRecordStart: '녹음 시작',
|
||
mobileRecordStop: '종료하고 제출',
|
||
composerPlaceholder: '질문을 입력하세요. Enter로 보내기',
|
||
composerSend: '보내기',
|
||
statusIdle: '{{recordHotkey}} 로 질문',
|
||
statusRecording: '녹음 중',
|
||
statusThinking: '생각 중',
|
||
statusError: '오류',
|
||
jumpToLatest: '최신으로 이동',
|
||
},
|
||
lessComputer: {
|
||
title: 'Less Computer',
|
||
subtitle: '컴퓨터로 무엇을 할까요?',
|
||
you: '나',
|
||
working: '조작 중…',
|
||
tool: '{{name}} 사용',
|
||
compaction: '컨텍스트가 압축되었습니다',
|
||
done: '완료',
|
||
cost: '${{cost}}',
|
||
error: '실패했습니다. 다시 시도하세요.',
|
||
closeTooltip: '닫기',
|
||
jumpToLatest: '최신으로 이동',
|
||
inputPlaceholder: '명령을 입력하고 Enter로 전송',
|
||
send: '전송',
|
||
approvalTitle: '차단된 명령을 실행할까요?',
|
||
approvalRerunWarning: '주의: 승인하면 이미 수정된 작업 공간에서 다시 실행되어 멱등하지 않은 작업에 부작용이 생길 수 있습니다.',
|
||
approve: '허용',
|
||
deny: '거부',
|
||
approved: '허용됨',
|
||
denied: '거부됨',
|
||
},
|
||
nav: {
|
||
overview: '개요',
|
||
history: '기록',
|
||
vocab: '어휘',
|
||
style: '스타일',
|
||
marketplace: '마켓',
|
||
translation: '번역',
|
||
selectionAsk: '선택 질문',
|
||
polishMode: '다듬기 모드',
|
||
group: {
|
||
style: '스타일',
|
||
tools: '도구',
|
||
},
|
||
localAsr: '모델 설정',
|
||
more: '더보기',
|
||
},
|
||
marketplace: {
|
||
kicker: 'MARKETPLACE',
|
||
title: '스타일 팩 마켓',
|
||
desc: '커뮤니티 스타일 팩 둘러보기, 설치, 공유.',
|
||
searchPlaceholder: '이름 / 설명 / 태그 검색…',
|
||
sortPopular: '인기순',
|
||
sortNew: '최신',
|
||
uploadBtn: '업로드',
|
||
uploadDisabledHint: '먼저 설정 → 마켓에서 GitHub 사용자명을 설정하세요',
|
||
refreshBtn: '새로고침',
|
||
empty: '아직 스타일 팩이 없습니다',
|
||
emptyHint: '다른 키워드로 검색하거나 직접 업로드해 보세요',
|
||
loadFailed: '불러오기 실패: {{err}}',
|
||
noDescription: '(설명 없음)',
|
||
installBtn: '설치',
|
||
installingBtn: '설치 중…',
|
||
likeBtn: '좋아요',
|
||
installed: '"{{name}}"을(를) 로컬에 설치했습니다',
|
||
uploaded: '업로드 완료, 심사 대기 중',
|
||
uploadTitle: '업로드할 팩 선택',
|
||
uploadHint: '{{login}}(으)로 업로드합니다. 콘텐츠는 클라우드 심사 큐로 전송됩니다.',
|
||
uploadNoLocal: '업로드 가능한 로컬 팩이 없습니다',
|
||
errors: {
|
||
detail: '상세 불러오기 실패: {{err}}',
|
||
install: '설치 실패: {{err}}',
|
||
like: '좋아요 실패: {{err}}',
|
||
upload: '업로드 실패: {{err}}',
|
||
loadLocal: '로컬 팩 불러오기 실패: {{err}}',
|
||
},
|
||
sortLiked: '좋아요한 팩',
|
||
likedEmpty: '아직 좋아요한 팩이 없습니다',
|
||
likedEmptyHint: '팩을 열고 별을 누르면 여기에 표시됩니다',
|
||
derivativeBadge: '@{{login}}에서 파생',
|
||
detail: {
|
||
withdrawBtn: '게시 취소',
|
||
withdrawConfirm: '"{{name}}"을(를) 마켓에서 내릴까요? 로컬 사본은 유지됩니다.',
|
||
withdrawSuccess: '마켓에서 내렸습니다',
|
||
withdrawFailed: '취소 실패: {{err}}',
|
||
},
|
||
myPacks: {
|
||
buttonLabel: '내 게시물',
|
||
buttonTitle: '{{login}}의 게시물 보기',
|
||
buttonTitleEmpty: '먼저 설정 → 마켓에서 게시자 이름을 입력하세요',
|
||
searchPlaceholder: '이름·태그 검색',
|
||
notLoggedIn: '먼저 설정 → 마켓에서 게시자 이름을 입력하세요',
|
||
emptyTitle: '아직 게시한 팩이 없습니다',
|
||
emptyHint: '"스타일" 페이지에서 편집 후 "마켓에 게시"를 누르거나, 오른쪽 위에서 로컬 팩을 업로드하세요.',
|
||
noMatch: '일치하는 팩이 없습니다',
|
||
summary: '게시 {{count}}개',
|
||
summaryPending: '게시 {{count}}개 · 심사 중 {{pending}}개',
|
||
versionDate: 'v{{version}} · {{date}}',
|
||
stats: '★ {{likes}} · ↓ {{downloads}}',
|
||
actions: {
|
||
update: '업데이트',
|
||
withdraw: '내리기',
|
||
},
|
||
loadFailed: '내 게시물 불러오기 실패: {{err}}',
|
||
loadingTitle: '불러오는 중…',
|
||
loadingHint: '마켓에서 최신 게시물을 가져오는 중입니다.',
|
||
loadErrorTitle: '불러오기 실패',
|
||
loadErrorRetry: '다시 시도',
|
||
},
|
||
upload: {
|
||
confirmBtn: '업로드 확정',
|
||
updateTitle: '"{{name}}" 업데이트',
|
||
updateHint: '업로드할 로컬 최신본을 선택하고 "업로드 확정"을 누르세요. 동명 팩이 기본 선택됩니다.',
|
||
recommendedBadge: '권장',
|
||
},
|
||
state: {
|
||
pending: '심사 중',
|
||
approved: '게시됨',
|
||
rejected: '거부',
|
||
withdrawn: '내려짐',
|
||
superseded: '신버전으로 대체',
|
||
unknown: '알 수 없음',
|
||
},
|
||
oauth: {
|
||
title: 'GitHub로 로그인',
|
||
generating: '디바이스 코드 생성 중…',
|
||
browserHint: '브라우저에서 {{uri}}을(를) 열고 아래 코드를 입력하세요:',
|
||
copyBtn: '복사',
|
||
copied: '디바이스 코드 복사됨',
|
||
copyFailed: '복사 실패: {{err}}',
|
||
openBrowserBtn: '브라우저 열기',
|
||
cancelBtn: '취소',
|
||
waiting: '브라우저에서 인증을 기다리는 중…',
|
||
successAs: '@{{login}}(으)로 로그인',
|
||
retryBtn: '다시 시도',
|
||
closeBtn: '닫기',
|
||
loginBtn: '로그인',
|
||
loginTooltip: 'GitHub로 로그인',
|
||
reloginTooltip: '다시 로그인 / 계정 전환(현재 @{{login}})',
|
||
},
|
||
modal: {
|
||
loggedIn: '현재 로그인 ID — 설정 → 녹음 → 마켓에서 변경',
|
||
notLoggedIn: '로그인되지 않음 — 설정 → 녹음 → 마켓에서 게시자 이름을 설정',
|
||
notLoggedInLabel: '로그인 안 됨',
|
||
},
|
||
},
|
||
shell: {
|
||
shortcutLabel: '녹음 단축키',
|
||
shortcutHint: '시작 / 정지',
|
||
betaTag: 'BETA',
|
||
betaNote: '모든 데이터는 로컬에만 저장됩니다.',
|
||
navHint: {
|
||
overview: '상태 개요: 사용량 통계, 제공자 및 권한 상태',
|
||
history: '받아쓰기 기록: 과거 전사 검색·재생·복사',
|
||
vocab: '어휘: 고유명사 인식률을 높이는 사용자 지정 핫워드',
|
||
style: '스타일: 출력 스타일과 사용자 지정 프롬프트 관리',
|
||
translation: '번역: Shift를 누른 채 말하면 대상 언어로 삽입',
|
||
selectionAsk: '선택 질문: 텍스트를 선택한 뒤 음성으로 질문',
|
||
settings: '환경설정: 단축키, 제공자, 개인정보 및 업데이트',
|
||
},
|
||
footer: {
|
||
account: '계정',
|
||
feedback: '피드백',
|
||
settings: '설정',
|
||
help: '도움말',
|
||
version: '버전 {{version}}',
|
||
helpPopover: {
|
||
tagline: '로컬 기반 음성 입력 레이어',
|
||
releaseNotes: '릴리스 노트 보기 ↗',
|
||
docs: '도움말 센터 ↗',
|
||
},
|
||
},
|
||
providerPrompt: {
|
||
title: '음성 공급자 설정',
|
||
body: 'ASR 또는 LLM 공급자가 설정되지 않아 음성 입력과 정리가 일시적으로 작동하지 않습니다.',
|
||
later: '나중에',
|
||
openSettings: '설정 열기',
|
||
},
|
||
hotkeyModePrompt: {
|
||
title: '녹음 방식 확인',
|
||
body: '기본값이 토글로 변경되었습니다. 이전에 트리거 방식을 변경한 경우 녹음 설정에서 확인하세요.',
|
||
later: '나중에 알림',
|
||
openSettings: '녹음 설정 열기',
|
||
},
|
||
},
|
||
onboarding: {
|
||
welcome: 'OpenLess 에 오신 것을 환영합니다',
|
||
intro: '로컬에서 말하고 로컬에서 입력합니다. 시작 전에 두 가지 시스템 권한이 필요합니다.',
|
||
accessibilityTitle: '접근성',
|
||
hotkeyTitle: '전역 단축키',
|
||
accessibilityDesc: '전역 단축키(기본 {{trigger}}) 감지와 인식 결과를 커서 위치에 입력하기 위해 사용합니다.',
|
||
hotkeyDesc: '전역 단축키 감지가 사용 가능한지 확인하기 위해 사용합니다.',
|
||
micTitle: '마이크',
|
||
micDesc: '음성 입력을 캡처하기 위해 사용합니다.',
|
||
actionNotApplicable: '권한 불필요',
|
||
actionGranted: '허용됨',
|
||
actionOpenSystem: '시스템 설정 열기',
|
||
actionRestart: '접근성 권한 재설정 후 OpenLess 재시작',
|
||
actionGrant: '허용',
|
||
actionRequestMic: '권한 대화상자 표시',
|
||
accessibilityHint: '허용 후에는 **OpenLess 를 완전히 종료** 한 다음 다시 실행해야 합니다(macOS TCC 규칙).',
|
||
footerHint: '모든 권한이 부여되면 이 가이드는 자동으로 닫힙니다. 닫히지 않으면 메뉴 막대의 OpenLess → 종료 후 앱을 다시 실행해 주세요.',
|
||
androidContinue: '앱으로 계속',
|
||
androidFooterHint: '받아쓰기에는 마이크 권한이 필요합니다. 위의 권한 요청을 탭하거나, 앱으로 먼저 들어가 개요 페이지에서 나중에 허용할 수 있습니다.',
|
||
androidTitle: 'OpenLess 설정',
|
||
androidIntro: '모바일 권한과 서비스 설정을 단계별로 완료합니다.',
|
||
androidStepCounter: '{{current}} / {{total}} 단계',
|
||
androidBack: '이전',
|
||
androidNext: '다음',
|
||
androidFinish: '완료하고 시작',
|
||
androidSteps: {
|
||
microphoneTitle: '마이크 권한',
|
||
microphoneDesc: 'Android 시스템 권한 카드를 표시하고 OpenLess 녹음을 허용합니다.',
|
||
accessibilityTitle: '접근성 서비스',
|
||
accessibilityDesc: '인식 결과를 현재 입력란에 붙여넣고 입력 환경 감지를 보조합니다.',
|
||
overlayPermissionTitle: '플로팅 창 권한',
|
||
overlayPermissionDesc: '다른 앱 위에 녹음 제어 버튼을 표시할 수 있게 합니다.',
|
||
overlayConfigTitle: '플로팅 창 설정',
|
||
overlayConfigDesc: '표시 시점, 활성화 방식, 스와이프 동작, 버튼 크기를 설정합니다.',
|
||
asrTitle: 'ASR 클라우드 서비스',
|
||
asrDesc: '음성 인식 서비스의 공급자, 키, 엔드포인트, 모델을 설정합니다.',
|
||
llmTitle: 'LLM 서비스',
|
||
llmDesc: '문장 다듬기, 번역, Q&A에 사용할 언어 모델 서비스를 설정합니다.',
|
||
},
|
||
},
|
||
overview: {
|
||
kicker: 'DASHBOARD',
|
||
title: '오늘 개요',
|
||
desc: '오늘의 받아쓰기 통계와 시스템 상태.',
|
||
pressPrefix: '누르기',
|
||
pressSuffix: '녹음 시작',
|
||
asrKind: 'ASR 음성',
|
||
llmKind: 'LLM 모델',
|
||
asrName: 'Volcengine',
|
||
asrSubname: 'bigmodel',
|
||
llmName: 'OpenAI 호환',
|
||
llmConfigured: '활성 LLM 구성됨',
|
||
llmNotConfigured: '구성되지 않음',
|
||
statusConfigured: '구성됨',
|
||
statusNotConfigured: '구성되지 않음',
|
||
statusUnknown: '읽을 수 없음',
|
||
credentialsLoadError: '자격 증명 상태를 읽을 수 없습니다',
|
||
metricChars: '오늘 글자 수',
|
||
metricSegments: '{{count}} 세그먼트',
|
||
metricDuration: '오늘 총 시간',
|
||
metricAvg: '평균 세그먼트',
|
||
metricAvgTrend: '오늘 평균',
|
||
metricNoData: '데이터 없음',
|
||
historyLoadError: '기록 로드 실패',
|
||
metricTotal: '누적 기록',
|
||
metricTotalTrend: '로컬 보관(상한 200)',
|
||
weekTitle: '최근 7일',
|
||
activityTitle: '연간 활동',
|
||
activityCount: '{{count}}회 받아쓰기',
|
||
weekUnit: '건/일',
|
||
recentTitle: '최근 인식',
|
||
recentAll: '전체 보기 →',
|
||
recentEmpty: '아직 기록이 없습니다. {{trigger}} 를 눌러 첫 녹음을 시작하세요.',
|
||
recentLoadFailed: '최근 인식 기록을 불러올 수 없습니다. 다시 시도해 주세요.',
|
||
historyRetry: '다시 시도',
|
||
weekDays: ['일', '월', '화', '수', '목', '금', '토'],
|
||
inAppDictation: {
|
||
title: '앱 내 받아쓰기',
|
||
start: '녹음 시작',
|
||
stop: '녹음 중지',
|
||
idle: '탭하여 녹음 시작',
|
||
recording: '녹음 중…',
|
||
processing: '처리 중…',
|
||
},
|
||
androidMicBanner: {
|
||
title: '마이크 권한이 필요합니다',
|
||
desc: '마이크를 허용하면 앱 내 받아쓰기와 음성 입력을 사용할 수 있습니다.',
|
||
grant: '권한 요청',
|
||
openSettings: '설정 열기',
|
||
},
|
||
},
|
||
history: {
|
||
exportError: '녹음을 내보내지 못했습니다. 다시 시도해 주세요.',
|
||
kicker: 'HISTORY',
|
||
title: '기록',
|
||
desc: '로컬에 저장된 인식 기록.',
|
||
filterAll: '전체',
|
||
summary: '총 {{total}}건 · 표시 {{shown}}',
|
||
searchPlaceholder: '기록 검색…({{shortcut}})',
|
||
searchNoMatch: '“{{query}}”과(와) 일치하는 항목이 없습니다.',
|
||
empty: '기록이 없습니다. {{trigger}} 를 눌러 한 번 녹음해 보세요.',
|
||
loadFailed: '기록 로드 실패: {{err}}',
|
||
retry: '다시 시도',
|
||
clearFailed: '기록 비우기 실패: {{err}}',
|
||
deleteFailed: '항목 삭제 실패: {{err}}',
|
||
copyFailed: '복사 실패: {{err}}',
|
||
playRecording: '녹음 재생',
|
||
audioLoading: '로딩 중…',
|
||
audioDecodeFailed: '오디오 디코딩 실패: {{err}}',
|
||
exportRecording: '녹음 내보내기',
|
||
exportFailed: '내보내기 실패: {{err}}',
|
||
retranscribe: '다시 인식',
|
||
retranscribing: '인식 중…',
|
||
retranscribeFailed: '다시 인식 실패: {{err}}',
|
||
rawLabel: '원문',
|
||
rawEmpty: '(비어 있음)',
|
||
selectHint: '왼쪽에서 하나를 선택하여 자세히 보기.',
|
||
recorded: '녹음 {{duration}}',
|
||
stepAsr: '인식',
|
||
stepAsrHint: '키를 뗀 후 인식 결과를 기다린 시간. 스트리밍 인식은 녹음 중에 변환하므로 보통 녹음 시간보다 훨씬 짧습니다.',
|
||
stepPolish: '다듬기',
|
||
stepInsert: '삽입',
|
||
chars: '{{count}}자',
|
||
vocabHits: '핫워드 {{count}}개',
|
||
inserted: '입력됨',
|
||
pasteSent: '붙여넣기 시도됨',
|
||
copiedFallback: '복사됨({{shortcut}} 필요)',
|
||
insertFailed: '입력 실패',
|
||
confirmClear: '전체 {{count}}건의 기록을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.',
|
||
backToList: '목록으로',
|
||
},
|
||
vocab: {
|
||
kicker: 'VOCABULARY',
|
||
title: '어휘',
|
||
desc: '새 단어나 전문 용어를 추가하여 인식 정확도 향상.',
|
||
sectionTitle: '항목',
|
||
placeholder: '단어를 입력하고 Enter 또는 추가 클릭…',
|
||
tip: '한영 혼용 지원 · 숫자로 시작하면 그대로 인식 · 적중 횟수 자동 카운트',
|
||
loadFailed: '로드 실패: {{err}}',
|
||
empty: '어휘가 없습니다. 위에 새 단어나 전문 용어를 입력하면 받아쓰기 시 우선 매칭됩니다.',
|
||
tipDisabled: '클릭하여 비활성화',
|
||
tipEnabled: '클릭하여 활성화',
|
||
removeAria: '삭제',
|
||
corrections: {
|
||
title: '교정 규칙',
|
||
tip: 'ASR 오인식 수정. {num} 숫자 와일드카드 지원.',
|
||
patternPlaceholder: '오인식 표현, 예: {num}粒',
|
||
replacementPlaceholder: '대상 표현, 예: {num}例',
|
||
empty: '아직 교정 규칙이 없습니다.',
|
||
invalid: '문자 그대로 바꾸기 또는 {num} 숫자 와일드카드 1개가 포함된 규칙만 지원합니다. 예: {num}粒 → {num}例.',
|
||
tipDisabled: '이 규칙 비활성화',
|
||
tipEnabled: '이 규칙 활성화',
|
||
removeAria: '교정 규칙 삭제',
|
||
},
|
||
presets: {
|
||
title: '시나리오 프리셋',
|
||
tip: '다중 선택 일괄 적용 가능. 편집 및 생성 지원.',
|
||
create: '프리셋 새로 만들기',
|
||
apply: '선택 활성화',
|
||
save: '프리셋 저장',
|
||
edit: '{{name}} 편집',
|
||
newPreset: '새 프리셋',
|
||
namePlaceholder: '프리셋 이름',
|
||
wordsPlaceholder: '어휘(쉼표 또는 줄바꿈으로 구분)',
|
||
},
|
||
},
|
||
style: {
|
||
kicker: 'STYLE',
|
||
title: '출력 스타일',
|
||
desc: '녹음의 기본 출력 스타일 선택.',
|
||
masterToggle: '전체 활성화',
|
||
currentDefault: '현재 기본',
|
||
ariaSetDefault: '기본으로 설정',
|
||
saveFailed: '저장 실패: {{error}}',
|
||
customPromptTitle: '사용자 프롬프트',
|
||
customPromptPlaceholder: '선택 사항입니다. 이 스타일의 기본 system prompt 끝에 추가됩니다.',
|
||
customPromptHint: '비워 두면 현재 동작이 그대로 유지됩니다. 저장 후 이 스타일의 실시간 다듬기와 repolish 모두에 적용됩니다. Ctrl/Cmd+Enter로도 저장할 수 있습니다.',
|
||
customPromptSave: '프롬프트 저장',
|
||
customPromptDirty: '미저장',
|
||
systemPromptMovedHint: '전체 system prompt 편집은 Settings -> Providers 로 이동했습니다. 이 페이지는 이제 스타일 활성화와 기본값만 다룹니다.',
|
||
modes: {
|
||
raw: { name: '원문', desc: '구두점과 필요한 문장 구분만 보충하고 다시 쓰거나 확장하지 않습니다.', sample: '원래 구어체 유지. "음", "그게" 같은 입버릇은 제거하지만 문장을 재구성하지 않습니다.' },
|
||
light: { name: '가벼운 정리', desc: '입버릇 제거, 구두점 보충, 자연스럽게 보낼 수 있는 텍스트로 정리합니다.', sample: '원고를 읽는 듯한 느낌이 들지 않도록 어조와 표현 습관은 남기되, 문장이 매끄럽게 흐르도록 합니다.' },
|
||
structured: { name: '명확한 구조', desc: '여러 주제나 단계가 있을 때 자동으로 항목별 목록으로 정리합니다.', sample: '1. 주제 1\na. 포인트\nb. 포인트\n2. 주제 2\na. 포인트\nb. 포인트' },
|
||
formal: { name: '정식 표현', desc: '업무 커뮤니케이션과 메일에 적합. 더 전문적이고 완성도 높은 문체.', sample: '메일 시나리오에서 인사말과 맺음말을 자동 인식. 공허한 상투어는 추가하지 않습니다.' },
|
||
},
|
||
pack: {
|
||
selectionListTitle: '선택 영역 다듬기 스타일',
|
||
selectionListDesc: 'ASR 없이 선택한 글에 사용: 문법, 명확성, 형식 다듬기. 스타일과 프롬프트를 따로 고를 수 있습니다.',
|
||
dictationTab: '녹음 / ASR 스타일',
|
||
selectionTab: '선택 영역 다듬기',
|
||
current: '현재',
|
||
useForSelection: '선택 영역에 사용',
|
||
writtenPolish: '서면 다듬기',
|
||
selectionPromptTitle: '선택 영역 다듬기 프롬프트(ASR 없음)',
|
||
selectionPromptHint: '사용자가 선택한 서면 텍스트용. ASR을 거치지 않으며, 받아쓰기로 취급하지 않고 그 안의 질문에도 답하지 않습니다.',
|
||
selectionPromptEditorDesc: '선택 영역 다듬기 프롬프트를 편집 중입니다. 입력은 사용자가 선택한 서면 텍스트이며 ASR을 거치지 않습니다.',
|
||
dictationPromptEditorDesc: '녹음 / ASR 스타일 프롬프트를 편집 중입니다. 입력은 음성 인식 후 받아쓰기 텍스트입니다.',
|
||
dictationPromptTitle: '녹음 / ASR 프롬프트',
|
||
dictationPromptHint: '녹음 후 받아쓰기한 ASR 텍스트용. 구어 정리, ASR 오타 수정, 고유명사 복원 규칙을 여기에 작성하세요.',
|
||
selectionPromptFallback: '서면 다듬기 프롬프트가 아직 설정되지 않았습니다. 안전한 기본값을 사용합니다.',
|
||
selectionActivated: '선택 영역 다듬기에 "{{name}}"을(를) 설정했습니다',
|
||
selectionActivateFailed: '선택 영역 다듬기 스타일 전환 실패: {{err}}',
|
||
selectionChars: '{{count}}자',
|
||
kicker: 'STYLE PACKS',
|
||
title: '스타일 팩',
|
||
desc: '로컬 스타일 팩 관리.',
|
||
marketplaceBtn: '마켓',
|
||
loadFailed: '스타일 팩 불러오기 실패: {{err}}',
|
||
importZip: 'ZIP 가져오기',
|
||
exportZip: 'ZIP 내보내기',
|
||
exportShort: '내보내기',
|
||
publishMarketplace: '마켓에 게시',
|
||
updateMarketplace: '마켓 새 버전으로 업데이트',
|
||
publishDisabledHint: '먼저 설정 → 마켓에서 GitHub 사용자명을 설정하세요',
|
||
publishSuccess: '게시 완료, 마켓 심사 대기 중',
|
||
publishFailed: '게시 실패: {{err}}',
|
||
publishBuiltinRejected: '기본 팩은 직접 게시할 수 없습니다. 먼저 편집해서 가져오기 버전을 만드세요.',
|
||
builtin: '기본',
|
||
imported: '가져옴',
|
||
active: '사용 중',
|
||
activate: '활성화',
|
||
edit: '편집',
|
||
closeEditor: '닫기',
|
||
unsaved: '저장 안 됨',
|
||
listTitle: '로컬 팩',
|
||
listDesc: '팩 둘러보기·전환.',
|
||
listCount: '{{count}}개',
|
||
addPackTileTitle: '새 팩',
|
||
addPackTileHint: '빈 템플릿으로 시작.',
|
||
createSuccess: '새 팩이 생성되었습니다',
|
||
createFailed: '팩 생성 실패: {{err}}',
|
||
save: '저장',
|
||
revert: '되돌리기',
|
||
saveSuccess: '스타일 팩이 저장되었습니다',
|
||
saveFailed: '스타일 팩 저장 실패: {{err}}',
|
||
activateSuccess: '"{{name}}"을(를) 사용 중으로 설정했습니다',
|
||
activateFailed: '사용 중 설정 실패: {{err}}',
|
||
importSuccess: '"{{name}}"을(를) 가져왔습니다',
|
||
importFailed: 'ZIP 가져오기 실패: {{err}}',
|
||
exportSuccess: '{{path}}에 내보냈습니다',
|
||
exportFailed: 'ZIP 내보내기 실패: {{err}}',
|
||
exportDirtyFirst: 'ZIP을 내보내기 전에 현재 팩을 저장하세요.',
|
||
resetBuiltin: '재설정',
|
||
resetSuccess: '"{{name}}"을(를) 재설정했습니다',
|
||
resetFailed: '팩 재설정 실패: {{err}}',
|
||
deleteImported: '삭제',
|
||
deleteConfirm: '"{{name}}"을(를) 삭제할까요? 되돌릴 수 없습니다.',
|
||
deleteSuccess: '"{{name}}"을(를) 삭제했습니다',
|
||
deleteFailed: '팩 삭제 실패: {{err}}',
|
||
summaryCurrentEmpty: '아직 팩이 선택되지 않았습니다',
|
||
editorTitle: '팩 편집',
|
||
editorDesc: '이 팩을 편집합니다.',
|
||
metaTitle: '설치 정보',
|
||
metaSource: '소스',
|
||
metaBaseMode: '베이스 모드',
|
||
metaUpdatedAt: '업데이트',
|
||
fieldName: '이름',
|
||
fieldAuthor: '작성자',
|
||
fieldAuthorPlaceholder: '선택. 출처 표시용',
|
||
fieldVersion: '버전',
|
||
fieldTags: '태그',
|
||
fieldTagsPlaceholder: '쉼표로 구분, 예: community, voiceover, formal',
|
||
fieldDescription: '설명',
|
||
fieldModel: '권장 모델(메타데이터)',
|
||
fieldModelPlaceholder: '선택. 예: gpt-4.1 / deepseek-v3',
|
||
fieldModelHint: '메타데이터일 뿐 실제 모델을 전환하지 않습니다.',
|
||
fieldCompatibility: '호환 앱 버전',
|
||
fieldCompatibilityPlaceholder: '선택. 예: >=1.3.0',
|
||
fullPromptTitle: 'System Prompt',
|
||
fullPromptHint: '이 팩만의 Prompt입니다.',
|
||
promptChars: '{{count}}자',
|
||
runtimeTitle: 'OpenLess 런타임 추가 지시',
|
||
runtimeDesc: '읽기 전용 런타임 보조.',
|
||
runtimeContextTitle: '컨텍스트 전제',
|
||
runtimeContextDesc: '언어·앱 컨텍스트에서',
|
||
runtimeContextEmpty: '현재 미리보기에는 추가되지 않습니다.',
|
||
runtimeHotwordTitle: '핫워드 블록',
|
||
runtimeHotwordDesc: '활성화된 핫워드에서',
|
||
runtimeHotwordEmpty: '현재 미리보기에는 추가되지 않습니다.',
|
||
runtimeHistoryTitle: '멀티턴 히스토리 가드',
|
||
runtimeHistoryDesc: '실시간 멀티턴 polish 전용',
|
||
runtimeHistoryEmpty: '이전 턴이 있을 때만 추가됩니다.',
|
||
runtimeActive: '활성',
|
||
runtimeInactive: '비활성',
|
||
runtimePreviewFailed: '런타임 미리보기 생성 실패: {{err}}',
|
||
runtimePreviewOmittedFrontApp: '미리보기에서 프런트앱 라벨이 생략되었습니다.',
|
||
examplesTitle: '효과 예시',
|
||
examplesDesc: '팩과 함께 내보내집니다.',
|
||
addExample: '예시 추가',
|
||
examplesEmpty: '아직 예시가 없습니다.',
|
||
exampleTitlePlaceholder: '예시 {{index}} 제목',
|
||
exampleInput: '입력',
|
||
exampleOutput: '출력',
|
||
examplesCount: '{{count}}개 예시',
|
||
discardCloseConfirm: '저장하지 않은 변경 사항을 버리고 에디터를 닫을까요?',
|
||
discardSwitchConfirm: '저장하지 않은 변경 사항을 버리고 "{{name}}"(으)로 전환할까요?',
|
||
derivativeBadge: '@{{login}}에서 파생',
|
||
},
|
||
},
|
||
translation: {
|
||
kicker: 'TRANSLATION',
|
||
title: '번역',
|
||
desc: '녹음 후 대상 언어로 자동 번역하여 삽입.',
|
||
statusEnabled: '활성화됨',
|
||
statusDisabled: '비활성화됨',
|
||
working: {
|
||
title: '작업 언어',
|
||
desc: '일상적으로 사용하는 언어를 선택하여 정리와 번역에 반영.',
|
||
},
|
||
target: {
|
||
title: '번역 대상 언어',
|
||
desc: '녹음 중 Shift 로 번역 실행. "비활성화" 시 Shift 무효.',
|
||
disabled: '비활성화 (Shift 로 번역 발동 안 함)',
|
||
},
|
||
save: {
|
||
workingFailed: '작업 언어 저장에 실패했습니다. 다시 시도하세요.',
|
||
targetFailed: '번역 대상 언어 저장에 실패했습니다. 다시 시도하세요.',
|
||
hotkeyRegisterFailed: '번역 단축키 등록에 실패했습니다. 설정은 저장되지 않았습니다.',
|
||
hotkeySaveFailed: '번역 단축키 저장에 실패했습니다. 다시 시도하세요.',
|
||
},
|
||
howto: {
|
||
title: '사용 방법',
|
||
step1: '아무 입력 필드에 커서를 놓으세요.',
|
||
step2: '{{trigger}} 를 눌러 녹음 시작.',
|
||
step3: '녹음 중 Shift 를 한 번 눌러 번역 활성화.',
|
||
step4: '다시 {{trigger}} 를 눌러 정지.',
|
||
step5: '번역 결과가 커서 위치에 삽입됩니다.',
|
||
indicatorTitle: '번역 모드 활성화 확인 방법',
|
||
indicatorDesc: 'Shift 를 누르면 화면 하단에 파란색 "번역 중" 표시가 나타납니다.',
|
||
fallbackTitle: '안전 폴백',
|
||
fallbackDesc: '번역 실패 시 원본 전사가 삽입됩니다.',
|
||
},
|
||
},
|
||
selectionAsk: {
|
||
kicker: 'SELECTION ASK',
|
||
title: '선택 질문',
|
||
desc: '텍스트 선택 후 음성으로 질문. 다중 라운드 후속 질문 지원.',
|
||
statusEnabled: '활성화됨',
|
||
statusDisabled: '비활성화됨',
|
||
hotkey: {
|
||
title: '플로팅 창 단축키',
|
||
desc: '패널 열기/닫기 제어. 패널 내 녹음은 {{recordHotkey}} 사용.',
|
||
optionDisabled: '비활성화',
|
||
chordWarning: '',
|
||
},
|
||
save: {
|
||
hotkeyRegisterFailed: '선택 질문 단축키 등록에 실패했습니다. 설정은 저장되지 않았습니다.',
|
||
hotkeySaveFailed: '선택 질문 단축키 저장에 실패했습니다. 다시 시도하세요.',
|
||
historySaveFailed: 'Q&A 기록 설정 저장에 실패했습니다. 다시 시도하세요.',
|
||
},
|
||
history: {
|
||
title: '기록 저장',
|
||
desc: '활성화 시 Q&A 기록을 로컬에 저장. 기본 OFF.',
|
||
},
|
||
howto: {
|
||
title: '사용 방법',
|
||
step1: '{{hotkey}} 로 패널 열기.',
|
||
step2: '아무 앱에서 텍스트 선택.',
|
||
step3: '{{recordHotkey}} 로 녹음, 다시 눌러 제출.',
|
||
step4: '{{recordHotkey}} 로 계속 후속 질문 가능.',
|
||
step5: 'Esc 로 패널 닫기 및 기록 삭제.',
|
||
windowTitle: '창 위치 + 드래그 + 고정',
|
||
windowDesc: '패널은 드래그 가능하며 위치를 기억합니다. 고정하면 열린 상태 유지.',
|
||
privacyTitle: '프라이버시 계약',
|
||
privacyDesc: '선택 텍스트는 메모리에만 존재하며 패널 닫으면 삭제. 4000 자 초과 시 자동 축소.',
|
||
},
|
||
},
|
||
settings: {
|
||
selectionPolish: {
|
||
title: '선택 영역 다듬기',
|
||
hotkey: '실행 단축키',
|
||
hotkeyDesc: '녹화 후 즉시 적용됩니다. 녹음, 질문 등 다른 전역 단축키와 충돌하면 거부됩니다.',
|
||
delivery: '결과 처리 방식',
|
||
hint: '텍스트를 선택한 뒤 실행합니다. 마이크나 ASR이 필요 없으며 현재 스타일 팩과 전용 선택 프롬프트를 사용합니다.',
|
||
directReplace: '직접 교체',
|
||
directReplaceHint: '모델 완료 후 원래 선택 영역을 안전하게 교체합니다.',
|
||
previewConfirm: '미리보기 후 확인',
|
||
previewConfirmHint: '편집 가능한 창에서 결과를 확인한 뒤 원래 선택 영역을 교체합니다.',
|
||
},
|
||
kicker: 'SETTINGS',
|
||
title: '설정',
|
||
desc: '녹음, 공급자, 단축키, 권한 설정.',
|
||
dataStorage: {
|
||
title: '데이터 저장',
|
||
desc: '이 기기에 보관되는 대화 기록과 컨텍스트.',
|
||
},
|
||
codingConsole: {
|
||
title: 'Claude 콘솔',
|
||
desc: '로컬 Claude Code 와 MCP(computer use) 상태를 감지하고, 가드레일 아래에서 Claude 를 헤드리스로 실행하여 출력과 비용을 스트리밍으로 확인합니다.',
|
||
guardNote: '복구 가능한 작업은 기본 허용; rm -rf / sudo / 강제 푸시 등 고위험 명령은 차단; 작업 디렉터리가 git 저장소이면 실행 전 스냅샷을 만들어 되돌릴 수 있습니다.',
|
||
status: '상태',
|
||
detect: '감지',
|
||
detecting: '감지 중…',
|
||
installed: 'Claude 감지됨',
|
||
notInstalled: 'claude 를 찾을 수 없음',
|
||
notInstalledHint: '먼저 Claude Code 를 설치하세요(docs.anthropic.com/claude-code 참고). 또는 아래에 실행 파일 전체 경로를 입력하세요.',
|
||
mcpServers: 'MCP 서버 {{count}}개 구성됨',
|
||
computerUsePresent: '데스크톱 제어(computer use) MCP 구성됨',
|
||
computerUseAbsent: '데스크톱 제어 MCP 없음(복사/붙여넣기 같은 가벼운 작업은 Bash 로 가능, 불필요)',
|
||
exePath: '실행 파일',
|
||
workdir: '작업 디렉터리',
|
||
workdirDesc: '선택 사항. Claude 가 이 디렉터리에서 실행됩니다. git 저장소이면 실행 전 스냅샷으로 되돌릴 수 있습니다.',
|
||
workdirPlaceholder: '비우면 임시 디렉터리에서 실행',
|
||
permissionMode: '권한 모드',
|
||
mode: {
|
||
acceptEdits: '허용(복구 가능)',
|
||
plan: '읽기 전용 / 계획',
|
||
default: '기본(매번 확인)',
|
||
bypassPermissions: '완전 허용(위험)',
|
||
},
|
||
promptPlaceholder: 'Claude 에게 작업 지시, 예: 현재 디렉터리 파일 목록',
|
||
run: '실행',
|
||
running: '실행 중…',
|
||
cancel: '취소',
|
||
clear: '지우기',
|
||
riskWarn: '고위험 의도 감지: {{reason}}. 가드레일이 실행 시 고위험 명령을 차단합니다.',
|
||
toolUse: '도구 {{name}}',
|
||
done: '완료',
|
||
doneCost: '완료 · 비용 ${{cost}}',
|
||
cancelled: '취소됨',
|
||
outputPlaceholder: '출력이 여기에 스트리밍됩니다…',
|
||
},
|
||
codingAgent: {
|
||
title: 'Less Computer',
|
||
desc: '키를 누르고 말하면 Claude가 PC를 조작합니다. macOS 전용.',
|
||
enable: 'Less Computer 켜기',
|
||
comingSoonNote: '설정은 즉시 저장됩니다. 단축키 트리거와 실행 흐름은 이후 버전에서 제공됩니다.',
|
||
hotkeyHint: '켜면 아래 단축키를 누른 채 말하고, 놓으면 Claude 결과가 캡슐에 표시됩니다.',
|
||
voiceHotkey: '누르고 말하기 키',
|
||
voiceHotkeyDesc: '누르고 말하고 놓으면 실행. Ctrl/Option/Fn 단일 키 지원. 기능 설명은 「고급」 설정 페이지 참조.',
|
||
provider: 'Agent 백엔드',
|
||
opencodeReady: 'OpenCode v{{version}} 감지됨.',
|
||
opencodeMissing: 'opencode 명령을 찾을 수 없습니다. 먼저 설치(npm i -g opencode-ai)하고 opencode auth login으로 로그인하세요.',
|
||
panelHotkey: '패널 키(음성 Agent)',
|
||
panelHotkeyDesc: '녹음 → ASR → Claude → 패널에 스트리밍. 기본 Cmd/Ctrl+Shift+Enter.',
|
||
quickHotkey: '빠른 가져오기 키',
|
||
quickHotkeyDesc: '선택한 텍스트 → Claude → 결과를 커서 위치로. 패널 없이 더 빠름.',
|
||
model: '모델',
|
||
modelPlaceholder: '기본: sonnet',
|
||
modelDefault: '기본(자동 sonnet)',
|
||
modelHint: 'Haiku = 가장 빠름 · Sonnet = 균형 · Opus = 최강',
|
||
exe: '실행 파일 경로',
|
||
},
|
||
debug: {
|
||
title: '디버그 도구',
|
||
desc: '인식 문제를 진단할 때 사용합니다. 평소에는 꺼두어도 됩니다.',
|
||
},
|
||
marketplace: {
|
||
title: '확장 마켓',
|
||
desc: '스타일 마켓 업로드 신원. 스타일 둘러보기와 설치는 「스타일」 페이지에서 합니다.',
|
||
github: {
|
||
signIn: 'GitHub로 로그인',
|
||
signedIn: 'GitHub로 로그인됨',
|
||
signedOut: '로그인하면 스타일 업로드와 좋아요를 할 수 있습니다.',
|
||
signOut: '로그아웃',
|
||
starting: '로그인을 시작하는 중…',
|
||
codeHint: '열린 GitHub 페이지에서 이 코드를 입력하세요:',
|
||
openGithub: 'GitHub 열기',
|
||
waiting: 'GitHub를 열었습니다. 승인하면 로그인됩니다…',
|
||
failed: '로그인 실패, 다시 시도하세요',
|
||
},
|
||
},
|
||
recording: {
|
||
title: '녹음 및 입력',
|
||
desc: '전역 녹음의 단축키와 트리거 방식을 정의합니다.',
|
||
hotkeyLabel: '녹음 단축키',
|
||
hotkeyDescAcc: '누르면 음성 캡처 시작(전역). 접근성 권한이 필요합니다.',
|
||
hotkeyDescNoAcc: '누르면 음성 캡처 시작(전역). 추가 권한 불필요.',
|
||
modeLabel: '녹음 방식',
|
||
modeDesc: '토글 방식 = 한 번 누르면 시작, 다시 누르면 종료; 눌러서 말하기 = 누르고 있는 동안만 녹음.',
|
||
modeToggle: '토글 방식',
|
||
modeHold: '눌러서 말하기',
|
||
modeAuto: '자동',
|
||
migrationNoticeTitle: '기본값이 토글 방식으로 변경됨',
|
||
migrationNoticeDesc: '이전에 트리거 방식을 변경했다면 여기서 다시 한 번 확인해 주세요. 이번 업데이트는 단축키 방식의 기본값과 읽기 로직을 조정했습니다. "눌러서 말하기"가 더 익숙하다면 다시 전환할 수 있습니다.',
|
||
microphoneLabel: '기본 선택 마이크',
|
||
microphoneDesc: '우선 사용할 입력 장치를 선택합니다. 장치를 일시적으로 사용할 수 없으면 시스템 기본 마이크를 사용하고, 다시 연결되면 자동으로 우선 장치로 돌아갑니다.',
|
||
microphoneDefault: '시스템 기본 마이크',
|
||
microphoneDefaultDesc: '시스템 기본 입력 장치 사용',
|
||
microphoneSystemDefault: '시스템 기본값',
|
||
microphoneUnavailable: '사용할 수 없음',
|
||
microphoneLoadError: '마이크 로드 실패: {{message}}',
|
||
microphoneDialogTitle: '마이크',
|
||
microphoneDialogDesc: '목소리를 받을 수 있는 마이크를 선택하세요. 미터가 움직이지 않으면 다른 마이크를 시도하세요.',
|
||
microphoneMonitorError: '입력 레벨 모니터링 실패: {{message}}',
|
||
capsuleLabel: '녹음 캡슐',
|
||
capsuleDesc: '녹음 / 전사 중 화면 하단에 반투명 캡슐을 표시합니다.',
|
||
capsuleStyleLabel: '캡슐 스타일',
|
||
capsuleStyleSiri: '시리 광선 스타일',
|
||
capsuleStyleClassic: 'Openless 기본 스타일',
|
||
muteDuringRecordingLabel: '녹음 중 음소거',
|
||
muteDuringRecordingDesc: '녹음 중 시스템 출력을 일시적으로 음소거하여 스피커 에코를 방지합니다.',
|
||
audioCueLabel: '녹음 시작음',
|
||
audioCueDesc: '단축키로 녹음을 시작할 때 합성된 짧은 알림음을 재생합니다. 캡슐이 숨겨져 있어도 재생됩니다.',
|
||
audioCuePreview: '미리듣기',
|
||
insertGroupTitle: '삽입 및 클립보드',
|
||
restoreClipboardLabel: '입력 후 클립보드 복원',
|
||
restoreClipboardDesc: '붙여넣기 성공 후 원래 클립보드 내용을 복원합니다 (Windows / Linux 만).',
|
||
pasteShortcutLabel: '붙여넣기 단축키',
|
||
pasteShortcutDesc: '삽입 시 시뮬레이션할 붙여넣기 단축키. 일부 터미널은 Ctrl+Shift+V 가 필요 (Windows / Linux 만).',
|
||
pasteShortcutCtrlV: 'Ctrl+V (기본 / 대부분 앱)',
|
||
pasteShortcutCtrlShiftV: 'Ctrl+Shift+V (kitty / alacritty / wezterm / 대부분 터미널)',
|
||
pasteShortcutShiftInsert: 'Shift+Insert (xterm / urxvt)',
|
||
comboRecordLabel: '단축키 녹화',
|
||
comboRecordDesc: '클릭 후 원하는 단축키 조합(예: ⌘⇧D)을 누르세요. 토글 및 누르기 모드 모두 지원합니다.',
|
||
comboRecordBtn: '단축키 녹화',
|
||
comboResetBtn: '초기화',
|
||
comboMenuToggle: '더보기',
|
||
comboDisableHint: '핵심 단축키는 비활성화할 수 없습니다 (녹음에는 단축키가 필수입니다)',
|
||
comboRecordHint: '단축키 조합을 눌러 주세요…',
|
||
comboNeedKey: '조합 키(예: ⌘⇧J)를 설정하세요. 단일 보조 키는 사용할 수 없습니다',
|
||
comboRecorded: '녹화됨',
|
||
comboClear: '지우기',
|
||
comboConflict: '이 단축키 조합은 사용할 수 없습니다',
|
||
allowNonTsfFallbackLabel: '비 TSF 폴백 허용',
|
||
allowNonTsfFallbackDesc: 'Windows: TSF 입력이 실패하면 분할된 Unicode SendInput을 사용하고, 그래도 실패하면 텍스트를 클립보드에 복사합니다.',
|
||
windowsInsertionModeLabel: 'Windows 삽입 방식',
|
||
windowsInsertionModeDesc: '받아쓰기 결과를 커서 위치에 삽입하는 방법. 클립보드 붙여넣기는 위의 「붙여넣기 단축키」를 사용하며 줄바꿈을 유지합니다.',
|
||
windowsInsertionModeTsf: 'TSF 입력기(기본)',
|
||
windowsInsertionModeSendInput: 'SendInput 키 입력 시뮬레이션',
|
||
windowsInsertionModePaste: '클립보드 붙여넣기(Ctrl+V 등)',
|
||
windowsSendInputNewlineModeLabel: 'SendInput 줄바꿈 시뮬레이션',
|
||
windowsSendInputNewlineModeDesc: 'SendInput 모드에서 줄바꿈을 어떤 키로 보낼지. 채팅 입력창은 Shift+Enter, 메모장 / VS Code 등은 Enter.',
|
||
windowsSendInputNewlineModeEnter: 'Enter(대부분 편집기)',
|
||
windowsSendInputNewlineModeShiftEnter: 'Shift+Enter(채팅 입력창)',
|
||
windowsSendInputNewlineModeCrLf: 'CR+LF Unicode',
|
||
windowsShowOpenlessInKeyboardListLabel: '키보드 목록에 OpenLess 표시',
|
||
windowsShowOpenlessInKeyboardListDesc: '끄면 Win+Space로 OpenLess에 전환되지 않습니다. SendInput 삽입에는 영향 없습니다. 다시 켜면 목록에 복원됩니다.',
|
||
windowsShowOpenlessInKeyboardListError: '키보드 목록을 업데이트할 수 없습니다: OpenLess TSF IME가 설치되지 않았거나 시스템이 변경을 거부했습니다.',
|
||
historyGroupTitle: '기록 및 컨텍스트',
|
||
historyRetentionLabel: '기록 보관 기간(일)',
|
||
historyRetentionDesc: '보관 기간을 초과한 기록은 새 항목 작성 시 정리됩니다. 0 = 시간 기반 정리 비활성화.',
|
||
historyMaxEntriesLabel: '기록 개수 상한',
|
||
historyMaxEntriesDesc: '로컬 보관 세션 상한. 빈칸 = 200. 범위 5–200.',
|
||
polishContextWindowLabel: '대화 컨텍스트 윈도(분)',
|
||
polishContextWindowDesc: '최근 N 분간 정리된 전사를 멀티턴 컨텍스트로 전달합니다. 0 = 비활성화.',
|
||
recordAudioForDebugLabel: '원본 녹음 보관(디버그)',
|
||
recordAudioForDebugDesc: '원시 마이크 오디오를 wav 로 저장하여 인식 문제 진단.',
|
||
audioRecordingMaxEntriesLabel: '원본 녹음 보관 개수',
|
||
audioRecordingMaxEntriesDesc: '로컬 보관 wav 파일 상한. 빈칸 = 200.',
|
||
startupGroupTitle: '시작',
|
||
startMinimizedLabel: '시작 시 메인 창 숨기기',
|
||
startMinimizedDesc: '모든 시작 경로에서 메인 창을 열지 않고 메뉴 막대 / 트레이에서만 실행합니다.',
|
||
autoUpdateCheckLabel: '자동 업데이트 확인',
|
||
autoUpdateCheckDesc: '시작 시 및 60 분마다 자동 확인.',
|
||
marketplaceGroupTitle: '스타일 팩 마켓플레이스',
|
||
marketplaceBaseUrlLabel: '백엔드 URL',
|
||
marketplaceBaseUrlDesc: '마켓플레이스 백엔드 URL. 빈칸은 기본값 사용.',
|
||
marketplaceDevLoginLabel: 'GitHub 로그인 이름 (업로드 ID)',
|
||
marketplaceDevLoginDesc: '업로더를 식별합니다. 빈칸 시 업로드 및 좋아요 비활성화.',
|
||
startupAtBoot: '부팅 시 자동 시작',
|
||
startupAtBootDesc: '로그인 시 OpenLess 자동 시작.',
|
||
startupAtBootError: '자동 시작 전환 실패: {{message}}',
|
||
},
|
||
providers: {
|
||
llmTitle: 'LLM 모델(정리)',
|
||
llmDesc: 'OpenAI 호환 프로토콜, 다양한 공급자 전환 지원.',
|
||
providerLabel: '공급자',
|
||
llmProviderDesc: '선택 시 Base URL 기본값이 자동 입력됩니다.',
|
||
credentialStorageNotice: '자격 증명은 OS 자격 증명 저장소에 보관됩니다.',
|
||
codexOAuthNotice: 'Codex OAuth는 로컬 Codex 로그인 상태(~/.codex/auth.json)를 사용합니다. OpenLess는 API Key나 Base URL을 저장하지 않습니다.',
|
||
asrProviderDesc: '전환 시 해당하는 자격 증명이 자동 선택됩니다.',
|
||
asrTitle: 'ASR 음성(전사)',
|
||
asrDesc: '녹음된 음성을 텍스트로 전사합니다.',
|
||
presets: {
|
||
ark: 'ARK (Volcengine Ark)',
|
||
deepseek: 'DeepSeek',
|
||
siliconflow: 'SiliconFlow',
|
||
atlascloud: 'Atlas Cloud',
|
||
openai: 'OpenAI',
|
||
gemini: 'Google Gemini',
|
||
codexOAuth: 'Codex OAuth',
|
||
mimo: 'Xiaomi MiMo',
|
||
cometapi: 'CometAPI',
|
||
openrouterFree: 'OpenRouter(무료 모델)',
|
||
alibabaCoding: 'Alibaba Cloud Coding Plan',
|
||
codingPlanX: 'CodingPlanX',
|
||
minimax: 'MiniMax (M3)',
|
||
stepfun: 'StepFun',
|
||
custom: '사용자 정의',
|
||
asrVolcengine: 'Volcengine bigasr',
|
||
asrBailian: 'Alibaba Bailian 실시간 ASR',
|
||
asrBailianQwen3: 'Bailian Qwen3 실시간 ASR',
|
||
asrBailianFunAsrFlash: 'Bailian Fun-ASR-Flash (녹음 파일)',
|
||
asrSiliconflow: 'SiliconFlow SenseVoice',
|
||
asrStepfun: 'StepFun StepAudio ASR',
|
||
asrZhipu: 'Zhipu GLM-ASR',
|
||
asrGroq: 'Groq Whisper-large-v3',
|
||
asrWhisper: 'OpenAI Whisper(호환)',
|
||
asrOpenrouter: 'OpenRouter Whisper',
|
||
asrXiaomiMimo: 'Xiaomi MiMo ASR',
|
||
asrElevenLabs: 'ElevenLabs Scribe',
|
||
asrSherpaOnnxLocal: '로컬 sherpa-onnx(실험적)',
|
||
asrFoundryLocalWhisper: '로컬 Whisper(Foundry Local)',
|
||
asrLocalQwen3: '로컬 Qwen3-ASR',
|
||
asrAppleSpeech: 'Apple 음성 (macOS)',
|
||
},
|
||
elevenLabsUploadNotice: 'ElevenLabs는 녹음 오디오를 설정된 엔드포인트에 업로드해 일괄 전사합니다.',
|
||
volcengineAppKeyLabel: 'APP ID',
|
||
volcengineAccessKeyLabel: 'Access Token',
|
||
volcengineApiKeyLabel: 'API Key',
|
||
volcengineResourceIdLabel: 'Resource ID',
|
||
volcengineAuthModeLabel: '인증 모드',
|
||
volcengineAuthModeAppIdToken: '레거시 앱 (APP ID + Access Token)',
|
||
volcengineAuthModeApiKey: 'Ark API Key',
|
||
volcengineMappingNote: 'Secret Key 는 현재 입력 불필요. Resource ID 기본값은 volc.seedasr.sauc.duration.',
|
||
volcengineApiKeyNote: 'Volcengine Ark 음성 모델 API 키로 인증하며 APP ID는 필요하지 않습니다. Resource ID 기본값은 volc.seedasr.sauc.duration입니다.',
|
||
localAsrActiveNotice: '현재 "{{name}}" 사용 중. "고급" 탭에서 전환 또는 비활성화할 수 있습니다.',
|
||
localAsrTakeoverHint: '"{{name}}" 활성화 시 ASR 프로바이더가 인수됩니다.',
|
||
asrProviderTakenOver: 'ASR 프로바이더 인수 완료',
|
||
localAsrHint: '기기에서 실행, API 키 불필요. HuggingFace 에서 모델 다운로드.',
|
||
foundryLocalAsrHint: '기기에서 실행, ASR API 키 불필요. 첫 사용 시 런타임과 모델 다운로드.',
|
||
localAsrPerformanceWarning: '로컬 추론은 클라우드보다 느리며 중국어 정확도가 낮을 수 있습니다. 오프라인 또는 개인정보 보호 시나리오에 적합.',
|
||
localAsrReady: '{{model}} 다운로드됨',
|
||
localAsrNotReady: '{{model}} 다운로드되지 않음',
|
||
localAsrGoDownload: '모델 설정에서 다운로드',
|
||
localAsrManage: '모델 설정으로 이동',
|
||
localAsrDownloadedTitle: '다운로드된 모델',
|
||
localAsrDelete: '삭제',
|
||
fillDefault: '기본값 입력',
|
||
readFailed: '읽기 실패',
|
||
apiKeyLabel: 'API 키',
|
||
baseUrlLabel: '엔드포인트',
|
||
modelLabel: '모델',
|
||
customModelLabel: '사용자 정의 모델…',
|
||
presetListLabel: '프리셋으로 돌아가기',
|
||
temperatureLabel: 'Temperature',
|
||
temperaturePlaceholder: '비워 두면 보내지 않음. 범위 0~2(양 끝 포함), 예: 0.3',
|
||
extraHeadersLabel: '추가 Headers',
|
||
extraHeadersPlaceholder: '{"custom-head":"..."}',
|
||
thinkingModeLabel: '사고',
|
||
thinkingModeOn: '켜짐',
|
||
thinkingModeOff: '꺼짐',
|
||
thinkingModeHint: '꺼짐은 채널 단위 공식 파라미터로 사고를 끄거나 최소화합니다. 켜짐은 채널 기본값으로 사고를 켭니다. prompt 주입이나 모델별 어댑터는 사용하지 않습니다.',
|
||
bailianVocabularyIdLabel: '핫워드 Vocabulary ID(선택)',
|
||
bailianVocabularyIdNote: 'DashScope에서 핫워드 사전을 만들었다면 vocab-... ID를 입력하세요. 비워 두면 핫워드를 전송하지 않습니다.',
|
||
bailianModelRealtimeHint: '실시간 모델 · 말하는 동안 바로 전사.',
|
||
bailianModelSyncFileHint: '동기 녹음 모델 · 말을 마친 뒤 전체 전사(한 클립 ≤ 5분).',
|
||
bailianModelAsyncFileHint: '비동기 파일 모델 · 녹음을 업로드한 뒤 전사 작업 완료를 기다립니다.',
|
||
appIdLabel: 'App ID(애플리케이션 ID)',
|
||
accessKeyLabel: 'Access Key',
|
||
resourceIdLabel: 'Resource ID',
|
||
toolsLabel: '연결 확인',
|
||
toolsDesc: '위 설정을 먼저 저장한 후 현재 모델 연결성을 검증하거나 모델을 가져오세요. 실패해도 모델 ID 를 수동 입력할 수 있습니다.',
|
||
validate: '검증',
|
||
validating: '검증 중…',
|
||
fetchModels: '모델 가져오기',
|
||
loadingModels: '모델 가져오는 중…',
|
||
modelMissing: '모델이 설정되지 않았습니다. 먼저 모델 ID 를 입력해 주세요.',
|
||
modelsEmpty: '인증 성공이지만 사용 가능한 모델이 반환되지 않았습니다.',
|
||
modelsLoaded: '{{count}}개의 모델을 가져왔습니다.',
|
||
selectModel: '모델을 선택해 위 필드에 입력',
|
||
modelSaved: '모델 {{model}} 을(를) 저장했습니다.',
|
||
validateSuccess: '연결 확인을 통과했습니다.',
|
||
validateFailed: '연결 확인에 실패했습니다.',
|
||
providerHttpStatus: '공급자가 {{status}} 를 반환했습니다. API Key 권한 또는 Endpoint 를 확인해 주세요.',
|
||
endpointMustUseHttps: 'HTTP Endpoint 를 사용할 수 있지만, API Key 와 음성 내용이 전송 중 유출될 수 있습니다.',
|
||
endpointInvalid: 'Endpoint 형식이 올바르지 않습니다.',
|
||
bailianEndpointSchemeInvalid: 'Bailian 실시간 ASR은 DashScope WebSocket 게이트웨이를 사용합니다. 엔드포인트는 wss://로 시작해야 합니다(기본값: wss://dashscope.aliyuncs.com/api-ws/v1/inference/). https:// 호환 모드 주소는 여기서 사용할 수 없습니다.',
|
||
qwen3EndpointSchemeInvalid: 'Qwen3 실시간 ASR은 DashScope Realtime WebSocket 게이트웨이를 사용합니다. 엔드포인트는 wss://로 시작해야 합니다(기본값: wss://dashscope.aliyuncs.com/api-ws/v1/realtime). https:// 주소는 여기서 사용할 수 없습니다.',
|
||
responseTooLarge: '공급자 응답이 너무 커서 안전을 위해 검증을 중단했습니다.',
|
||
asrInvalidJson: 'ASR 응답이 유효한 JSON 이 아닙니다.',
|
||
asrMissingTextField: 'ASR 응답에 text 필드가 없습니다.',
|
||
apiKeyMissing: 'API Key 가 비어 있습니다.',
|
||
endpointMissing: 'Endpoint 가 비어 있습니다.',
|
||
requestTimeout: '요청 시간이 초과되었습니다. 잠시 후 다시 시도하세요.',
|
||
},
|
||
shortcuts: {
|
||
title: '단축키 한눈에 보기',
|
||
descAcc: '모든 단축키는 전역에서 작동. 권한 설정에서 접근성을 활성화해야 합니다.',
|
||
descNoAcc: '모든 단축키는 전역에서 작동. 응답이 없으면 권한 페이지에서 전역 단축키 감지 상태를 확인해 주세요.',
|
||
startStop: '녹음 시작 / 정지',
|
||
cancel: '이번 녹음 취소',
|
||
confirm: '캡슐 입력 확정',
|
||
switchStyle: '이전 스타일로 전환',
|
||
openApp: 'OpenLess 열기',
|
||
agentPolish: '선택 텍스트 다듬기',
|
||
agentPolishDesc: '텍스트 선택 → 키 → Claude 다듬기 → 선택 영역 교체.',
|
||
agentVoice: 'Less Computer',
|
||
agentVoiceDesc: '사용자 지정 키를 누른 채 말하기 → Claude 작업 실행 → 결과 캡슐 표시.',
|
||
agentVoiceHint: '「고급 → Less Computer」에서 누르고 말하기 키를 설정하세요.',
|
||
agentVoiceTrigger: 'Less Computer 누르고 말하기 키',
|
||
enable: '활성화',
|
||
disable: '비활성화',
|
||
confirmHint: '오른쪽 ✓ 클릭',
|
||
notSupported: '지원되지 않음',
|
||
androidReadOnly: 'Android에서는 전역 단축키를 사용할 수 없습니다. 개요 페이지의 녹음 버튼을 사용하세요.',
|
||
},
|
||
permissions: {
|
||
title: '권한',
|
||
descAcc: 'OpenLess 가 정상 작동하려면 다음 시스템 권한이 필요합니다. 허용 후에는 일반적으로 앱을 완전히 종료한 후 재시작해야 적용됩니다.',
|
||
descNoAcc: 'OpenLess 는 마이크 사용과 전역 단축키 감지 상태를 통해 네이티브 후크의 정상 동작을 판정해야 합니다.',
|
||
micLabel: '마이크',
|
||
micDesc: '음성 입력을 캡처하기 위해 사용합니다.',
|
||
accLabel: '접근성',
|
||
accDesc: '전역 단축키 감지와 인식 결과를 커서 위치에 입력하기 위해 사용합니다.',
|
||
hotkeyLabel: '전역 단축키',
|
||
hotkeyDescWithAdapter: '현재 어댑터: {{adapter}}. 단축키 감지가 설치되었는지 판정하기 위해 사용.',
|
||
hotkeyDescPlain: '단축키 감지가 설치되었는지 판정하기 위해 사용.',
|
||
networkLabel: '네트워크',
|
||
networkDesc: '클라우드 ASR / LLM 호출에 필요. 로컬 모드에서는 비활성화 가능.',
|
||
networkOk: '사용 가능',
|
||
networkOffline: '사용 불가',
|
||
checking: '확인 중…',
|
||
granted: '허용됨',
|
||
notApplicable: '권한 불필요',
|
||
denied: '허용되지 않음',
|
||
indeterminate: '미결정',
|
||
openSystem: '시스템 설정 열기',
|
||
restart: '재설정 후 재시작',
|
||
grant: '허용',
|
||
rerunAndroidSetup: '설정 마법사 다시 실행',
|
||
hotkeyInstalled: '설치됨',
|
||
hotkeyStarting: '설치 중…',
|
||
hotkeyFailed: '감지 실패',
|
||
windowsImeLabel: 'Windows 입력기 백엔드',
|
||
windowsImeDesc: '음성 세션 동안 OpenLess TSF 입력기로 일시적으로 전환하여 클립보드 입력 제한을 회피하기 위해 사용.',
|
||
windowsImeInstalled: '설치됨',
|
||
windowsImeUnavailable: '사용 불가',
|
||
androidImeLabel: '입력기 (IME)',
|
||
androidImeSelected: '선택됨',
|
||
androidImeEnabled: '활성화됨',
|
||
androidImeDisabled: '비활성',
|
||
androidOverlayLabel: '플로팅 오버레이',
|
||
androidAccessibilityLabel: '접근성 서비스',
|
||
androidAccessibilityImpact: '켜면 키보드를 전환하지 않고 현재 입력칸에 결과를 출력합니다. 끄면 클립보드에 복사되며 직접 붙여넣어야 합니다.',
|
||
androidInsertStrategyLabel: '텍스트 삽입 방식',
|
||
androidOverlayTriggerLabel: '오버레이 표시',
|
||
androidOverlayActivationModeLabel: '오버레이 활성화',
|
||
androidOverlayLeftSwipeActionLabel: '왼쪽 스와이프 동작',
|
||
androidOverlayCancelSwipeDirectionLabel: '취소 스와이프 방향',
|
||
androidOverlaySizeLabel: '오버레이 크기',
|
||
androidOverlaySizeHint: '플로팅 버튼 지름을 조정하고 현재 위치를 유지합니다.',
|
||
androidInsertStrategy: { accessibility: '입력칸에 자동 출력', clipboard: '클립보드만' },
|
||
androidInsertStrategyHint: { accessibility: '접근성 서비스가 필요합니다. 사용할 수 없으면 클립보드에 복사합니다.', clipboard: '접근성 권한이 필요 없으며 직접 붙여넣습니다.' },
|
||
androidOverlayTrigger: { background: '백그라운드', keyboard: '키보드 표시 시', always: '항상' },
|
||
androidOverlayTriggerHint: { background: '단순', keyboard: '이 모드는 보류되었습니다. 기존 설정은 백그라운드로 되돌립니다.', always: '항상 표시' },
|
||
androidOverlayTriggerDisabled: { keyboard: '키보드 표시 감지는 보류되었습니다. 이후 오버레이 제스처로 대체합니다.' },
|
||
androidOverlayActivationMode: { tap: '탭으로 활성화', long_press: '길게 눌러 활성화' },
|
||
androidOverlayActivationModeHint: { tap: '첫 탭은 대기 상태로 전환하고, 두 번째 탭은 일반 받아쓰기를 시작합니다.', long_press: '누르고 있는 동안 대기 상태가 되며, 손을 떼면 현재 녹음 또는 QA 턴을 종료합니다.' },
|
||
androidOverlayLeftSwipeAction: { translation: '번역 받아쓰기', style_pack: '스타일 팩 전환' },
|
||
androidOverlayLeftSwipeActionHint: { translation: '대기 상태에서 왼쪽으로 밀면 번역 받아쓰기를 시작합니다.', style_pack: '대기 상태에서 왼쪽으로 밀면 이전 스타일 팩으로 전환합니다.' },
|
||
androidOverlayCancelSwipeDirection: { up: '위로 스와이프', down: '아래로 스와이프' },
|
||
androidOverlayCancelSwipeDirectionHint: { up: '녹음 중 위로 밀면 전사와 삽입 없이 취소합니다.', down: '녹음 중 아래로 밀면 전사와 삽입 없이 취소합니다.' },
|
||
windowsIme: {
|
||
installed: '설치됨. 음성 입력 시 OpenLess 입력기로 일시 전환됩니다.',
|
||
notInstalled: '설치되지 않음. OpenLess 는 현재 클립보드 / WM_PASTE 폴백을 사용합니다.',
|
||
registrationBroken: '등록이 손상되었습니다. OpenLess 입력기를 재설치하세요.',
|
||
notWindows: 'Windows 만 사용 가능.',
|
||
},
|
||
},
|
||
advanced: {
|
||
streamingInsertTitle: '스트리밍 입력',
|
||
streamingInsertTitleLinux: '스트리밍 입력 (실험적)',
|
||
streamingInsertDesc:
|
||
'실시간 글자별 삽입으로 체감 지연 감소. 조건 불충족 시 일괄 붙여넣기로 전환.',
|
||
streamingInsertLabel: '스트리밍 입력',
|
||
streamingInsertHintMac:
|
||
'스트리밍 중 입력 소스를 ABC 로 임시 전환 (CJK IME 가로채기 방지). 세션 종료 시 자동 복원.',
|
||
streamingInsertHintWindows:
|
||
'SendInput Unicode 로 TSF / IME 를 우회. 입력 소스 전환 불필요.',
|
||
streamingInsertHintLinux:
|
||
'fcitx5 플러그인으로 텍스트 전송. 스트리밍 입력은 enigo + XTest 키 합성 사용.',
|
||
streamingInsertSaveClipboardLabel: '클립보드에 저장',
|
||
streamingInsertSaveClipboardHint: '삽입 성공 후 최종 텍스트를 클립보드에 기록하여 Cmd+V 로 다시 붙여넣을 수 있게 합니다. 끄면 클립보드를 건드리지 않습니다.',
|
||
localAsrTitle: '로컬 ASR 모델 (실험적)',
|
||
localAsrDesc: '전사를 클라우드에서 로컬 추론으로 전환합니다. 오프라인 / 프라이버시용에만 권장됩니다.',
|
||
localAsrWarningShort: '로컬 추론은 느리며, 사양 부족 시 글자 누락이 발생할 수 있습니다.',
|
||
qwen3Desc: '활성화하면 ASR 프로바이더가 인수됩니다.',
|
||
sherpaDesc: '활성화하면 ASR 프로바이더가 인수됩니다.',
|
||
foundryDesc: '활성화하면 ASR 프로바이더가 인수됩니다.',
|
||
notSupportedHere: '이 플랫폼에서는 미지원 (추론 모듈 미내장).',
|
||
enable: '활성화',
|
||
alreadyActive: '활성',
|
||
disableLocalLabel: '로컬 ASR 비활성화',
|
||
disableLocalDesc: '클라우드 ASR (기본 Volcengine bigasr) 로 돌아갑니다.',
|
||
disable: '비활성화',
|
||
platformNotSupported: '이 플랫폼에서는 로컬 ASR 모델 통합이 아직 지원되지 않습니다.',
|
||
confirmEnableLocalTitle: '로컬 ASR 을 활성화할까요?',
|
||
confirmEnableLocalBody: '활성화 후 전사는 클라우드보다 느리고 정확도가 낮을 수 있습니다.',
|
||
confirm: '활성화',
|
||
},
|
||
language: {
|
||
title: '인터페이스 언어',
|
||
desc: 'UI 표시 언어를 전환합니다. 현재 세션에 즉시 반영되며 다음 실행에도 유지됩니다.',
|
||
label: '언어',
|
||
labelDesc: '"시스템 따라가기"를 선택하면 OS 언어를 따릅니다.',
|
||
followSystem: '시스템 따라가기',
|
||
zh: '简体中文',
|
||
zhTW: '繁體中文',
|
||
en: 'English',
|
||
ja: '日本語 (Beta)',
|
||
ko: '한국어 (Beta)',
|
||
restartHint: '일부 네이티브 메뉴(트레이 등)는 앱 재시작 후 반영될 수 있습니다.',
|
||
},
|
||
theme: {
|
||
title: '모양',
|
||
label: '테마',
|
||
activityHeatmapLabel: '개요 페이지에 연간 활동 표시',
|
||
system: '시스템 따르기',
|
||
light: '라이트',
|
||
dark: '다크',
|
||
},
|
||
remoteInput: {
|
||
title: '원격 입력',
|
||
enableLabel: '원격 입력 활성화',
|
||
enableDesc: '휴대폰/태블릿 브라우저를 PC에 연결해 녹음하고, 음성을 PC 커서 위치에 실시간으로 입력합니다(HTTPS 필요, 첫 접속 시 인증서를 신뢰해야 함)',
|
||
portLabel: '수신 포트',
|
||
defaultModeLabel: '기본 녹음 방식',
|
||
modeToggle: '탭하여 전환',
|
||
modeHold: '눌러서 말하기',
|
||
urlLabel: '접속 URL',
|
||
pinLabel: '페어링 코드',
|
||
regeneratePin: '재생성',
|
||
portInUse: '포트 {{port}}이(가) 사용 중입니다. 변경하세요',
|
||
startError: '원격 입력 서비스 시작에 실패했습니다: {{reason}}',
|
||
securityHint: '같은 LAN에서만 접속 가능하며 페어링 코드 입력이 필요합니다. 사용하지 않을 때는 끄는 것을 권장합니다.',
|
||
certHint: '첫 접속 시 브라우저가 인증서를 신뢰할 수 없다고 경고합니다. 안내에 따라 "계속 진행"을 선택하세요.',
|
||
certTrustWarning:
|
||
'이 인증서는 이 PC의 원격 입력 서비스 전용입니다(다른 인증서를 발급할 수 없음). 출처를 알 수 없는 인증서는 신뢰하지 마세요. 더 이상 사용하지 않으면 휴대폰 설정에서 제거할 수 있습니다.',
|
||
},
|
||
about: {
|
||
tagline: '자연스럽게 말하고, 정확하게 작성하세요',
|
||
checkUpdate: '업데이트 확인',
|
||
checkUpdateBtn: '확인',
|
||
checkStableUpdateBtn: '정식판 확인',
|
||
checkBetaUpdateBtn: 'Beta 확인',
|
||
checkingUpdate: '확인 중…',
|
||
upToDate: '현재 최신 버전입니다.',
|
||
updateError: '확인 또는 업데이트에 실패했습니다. 잠시 후 다시 시도하세요.',
|
||
retryBtn: '다시 시도',
|
||
openReleases: 'Releases 열기',
|
||
source: '소스',
|
||
docs: '문서',
|
||
feedback: '피드백',
|
||
qq: '커뮤니티 QQ 그룹',
|
||
qqDesc: 'QQ 에서 그룹 번호를 검색해 가입하거나 QR 코드로 입장하세요.',
|
||
copyQq: '그룹 번호 복사',
|
||
privacy: '프라이버시',
|
||
privacyDesc: '녹음은 전사를 위해 설정한 클라우드 공급자에게 전송될 수 있습니다.',
|
||
localFirst: '로컬 우선',
|
||
linksTitle: '문서 링크',
|
||
betaChannelLabel: 'Beta 채널 참여',
|
||
betaChannelToggleLabel: 'Beta 채널 사용',
|
||
betaChannelDesc: '켜면 백그라운드 자동 업데이트가 Beta를 따릅니다. 끄면 정식판으로 돌아갑니다. 아래 버튼으로 언제든 Beta를 수동 확인할 수 있습니다.',
|
||
autoUpdateSectionTitle: '자동 업데이트',
|
||
autoUpdateCheckLabelAndroid: '자동 확인 및 다운로드',
|
||
autoUpdateCheckDescAndroid: '시작 시 및 60분마다 확인합니다. 업데이트가 있으면 자동 다운로드 후 시스템 설치 프로그램을 엽니다. 채널은 위 Beta 스위치를 따릅니다.',
|
||
betaChannelFetching: '최신 Beta 버전을 가져오는 중…',
|
||
betaChannelFetchBtn: '최신 Beta 확인',
|
||
betaChannelLatestPrefix: '최신 Beta:',
|
||
betaChannelDownloadBtn: '다운로드 페이지 열기',
|
||
betaChannelRefresh: '새로 고침',
|
||
betaChannelNoBeta: '아직 게시된 Beta 릴리스가 없습니다.',
|
||
betaChannelFetchError: 'Beta 릴리스 정보를 가져오지 못했습니다. 잠시 후 다시 시도하세요.',
|
||
betaChannelUpToDate: '최신',
|
||
betaChannelUpdateNow: '지금 업데이트',
|
||
betaChannelUpdateNowTitle: '최신 Beta를 확인·다운로드하고 업데이트 대화상자를 표시합니다',
|
||
betaChannelChecking: '확인 중…',
|
||
updateDialog: {
|
||
available: {
|
||
title: '새 버전 발견',
|
||
desc: 'OpenLess {{version}} 을(를) 발견했습니다. 지금 업데이트하시겠습니까?',
|
||
},
|
||
downloading: {
|
||
title: '업데이트 다운로드 중',
|
||
desc: 'OpenLess {{version}} 을(를) 다운로드 중입니다. 앱을 열어 두세요.',
|
||
},
|
||
downloaded: {
|
||
title: '업데이트 준비 완료',
|
||
desc: 'OpenLess {{version}} 설치가 완료되었습니다. 지금 자동 재시작하여 적용하시겠습니까?',
|
||
},
|
||
installing: {
|
||
title: '업데이트 설치 중',
|
||
desc: 'OpenLess {{version}} 을(를) 설치 중입니다. 앱을 열어 두세요.',
|
||
},
|
||
install: '지금 업데이트',
|
||
androidInstall: '다운로드 후 설치 프로그램 열기',
|
||
androidInstalled: {
|
||
title: '시스템 설치 프로그램이 열렸습니다',
|
||
desc: '안내에 따라 설치를 완료하세요. 설치 후 OpenLess를 다시 열면 {{version}}을 사용할 수 있습니다.',
|
||
},
|
||
downloadingLabel: '다운로드 중…',
|
||
installingLabel: '설치 중…',
|
||
later: '나중에 수동 재시작',
|
||
restartNow: '지금 재시작',
|
||
progress: '{{progress}}% · {{downloaded}} / {{total}}',
|
||
progressUnknown: '다운로드됨 {{downloaded}}',
|
||
installError: {
|
||
title: '업데이트 실패',
|
||
desc: '자동 업데이트를 완료하지 못했습니다: {{error}}. 다운로드 페이지에서 최신 버전을 직접 받아 설치할 수 있습니다.',
|
||
},
|
||
manualDownload: '수동 다운로드',
|
||
},
|
||
},
|
||
},
|
||
modal: {
|
||
sections: {
|
||
general: '일반',
|
||
services: '서비스',
|
||
privacy: '프라이버시',
|
||
advanced: '고급',
|
||
personalize: '개인 설정',
|
||
about: '정보',
|
||
helpCenter: '도움말 센터',
|
||
releaseNotes: '릴리스 노트',
|
||
},
|
||
personalize: {
|
||
font: '글꼴 크기',
|
||
fontDesc: 'UI 글꼴 크기를 전체 스케일. 즉시 반영.',
|
||
fontSmall: '소',
|
||
fontMedium: '중',
|
||
fontLarge: '대',
|
||
blur: '서리유리 강도',
|
||
blurDesc: '창 내부 backdrop-filter 강도에 영향(macOS 시스템 서리 레이어가 작동하지 않을 때 조정).',
|
||
},
|
||
about: {
|
||
tagline: '자연스럽게 말하고, 정확하게 작성하세요',
|
||
checkUpdate: '업데이트 확인',
|
||
checkUpdateBtn: '확인',
|
||
docs: '문서',
|
||
docsBtn: 'openless.app/docs ↗',
|
||
feedback: '피드백 채널',
|
||
feedbackBtn: 'GitHub Issues ↗',
|
||
source: '소스',
|
||
qq: '커뮤니티 QQ 그룹',
|
||
qqDesc: 'QQ 에서 그룹 번호를 검색해 가입하거나 QR 코드로 입장하세요.',
|
||
copyQq: '그룹 번호 복사',
|
||
exportErrorLog: '오류 로그 내보내기',
|
||
exportErrorLogDesc: '현재 세션의 실행 로그를 로컬에 저장합니다. 문제 조사나 피드백 전송에 사용하세요.',
|
||
exportErrorLogBtn: '내보내기',
|
||
exporting: '내보내는 중…',
|
||
exportSuccess: '저장됨',
|
||
exportFailed: '내보내기 실패',
|
||
privacy: '프라이버시',
|
||
privacyDesc: '인식 결과는 로컬에 저장되며 설정한 클라우드 공급자가 전사를 위해 녹음을 수신할 수 있습니다.',
|
||
localFirst: '로컬 우선',
|
||
},
|
||
},
|
||
windowChrome: {
|
||
minimize: '최소화',
|
||
maximize: '최대화',
|
||
close: '닫기',
|
||
},
|
||
hotkey: {
|
||
triggers: {
|
||
rightOption: '오른쪽 Option',
|
||
leftOption: '왼쪽 Option',
|
||
rightControl: '오른쪽 Control',
|
||
leftControl: '왼쪽 Control',
|
||
rightCommand: '오른쪽 Command',
|
||
leftCommand: '왼쪽 Command',
|
||
leftShift: '왼쪽 Shift',
|
||
rightShift: '오른쪽 Shift',
|
||
fn: 'Fn (지구본 키)',
|
||
rightAlt: '오른쪽 Alt',
|
||
mediaPlayPause: '⏯ 미디어 재생/일시정지',
|
||
custom: '사용자 지정 조합…',
|
||
},
|
||
fallback: '전역 단축키',
|
||
modeHoldSuffix: '(눌러서 말하기)',
|
||
modeToggleSuffix: '(시작 / 정지)',
|
||
modeAutoSuffix: '(자동 인식)',
|
||
usageHold: '{{trigger}} 를 누르고 말한 후 떼면 종료.',
|
||
usageToggle: '{{trigger}} 로 녹음 시작, 다시 누르면 종료.',
|
||
usageAuto: '{{trigger}} 를 짧게 누르면 시작 / 정지, 길게 누르면 말한 뒤 떼면 종료.',
|
||
adapter: {
|
||
macEventTap: 'macOS Event Tap',
|
||
windowsLowLevel: 'Windows 저수준 키보드 후크',
|
||
fcitx5: 'fcitx5 입력기 플러그인',
|
||
unavailable: '사용 불가',
|
||
},
|
||
},
|
||
localAsr: {
|
||
kicker: '로컬 ASR',
|
||
title: '모델 설정',
|
||
desc: '기기 내 음성 인식 모델 관리.',
|
||
storageTitle: '모델 저장 위치',
|
||
storageBaseDir: '선택한 상위 폴더',
|
||
storageModelsRoot: '실제 모델 폴더',
|
||
storageDefault: '시스템 기본 폴더',
|
||
storageChoose: '폴더 변경',
|
||
storageReset: '기본값으로 복원',
|
||
storageReveal: '모델 폴더 열기',
|
||
storageDesc: '사용자 지정 저장소는 선택한 폴더 아래에 OpenLess/models 를 만들고 기존 모델을 이동합니다. 이동 전에 다운로드를 취소하고 로드된 모델을 해제합니다.',
|
||
storageChooseTitle: '로컬 모델 저장 상위 폴더 선택',
|
||
storageChangeConfirm: '기존 로컬 모델을 {{path}}/OpenLess/models 로 이동합니다. 먼저 다운로드를 취소하고 로드된 모델을 해제합니다. 계속할까요?',
|
||
storageResetConfirm: '기존 로컬 모델을 시스템 기본 폴더로 되돌립니다. 현재 폴더: {{path}}. 계속할까요?',
|
||
modelDir: '모델 폴더',
|
||
revealDir: '폴더 열기',
|
||
deleteConfirm: '{{name}} 로컬 모델 파일을 삭제할까요? 되돌릴 수 없습니다.',
|
||
appleSpeechTitle: 'Apple 음성 인식(macOS)',
|
||
appleSpeechDesc: 'macOS 기본 음성 인식을 사용해 로컬에서 음성을 텍스트로 변환합니다. 모델 다운로드, API 키, 네트워크가 모두 필요 없습니다. 클라우드 ASR이 불안정할 때 자격 증명이 필요 없는 로컬 폴백입니다. 처음 사용할 때 음성 인식 권한 요청이 표시됩니다.',
|
||
appleSpeechUse: 'Apple 음성 사용',
|
||
qwenTitle: 'Qwen3-ASR 모델 관리',
|
||
qwenExperimentalBadge: '실험적',
|
||
engineUnavailable: '현재 플랫폼에는 Qwen3-ASR 추론 엔진이 포함되어 있지 않습니다. 모델은 다운로드할 수 있지만 여기서는 아직 Qwen3-ASR 을 활성화할 수 없습니다.',
|
||
qwenUnavailableOnWindows: 'Windows 에서는 아직 Qwen3-ASR 을 지원하지 않습니다. 위의 Foundry Local Whisper 를 사용해 주세요.',
|
||
foundryTitle: 'Windows Foundry Local Whisper',
|
||
foundryDesc: '기기 내 음성 인식, ASR API 키 불필요. 첫 사용 시 런타임과 모델 다운로드 필요.',
|
||
foundryAvailable: 'Windows 에서 사용 가능',
|
||
foundryUnavailable: 'Windows 전용',
|
||
foundryRuntimeReady: '런타임 구성 요소 다운로드됨',
|
||
foundryRuntimeMissing: '런타임 구성 요소 미다운로드',
|
||
foundryRuntimeSourceLabel: '런타임 구성 요소 다운로드 소스',
|
||
foundryRuntimeSourceAuto: '자동(NuGet 우선)',
|
||
foundryRuntimeSourceNuget: 'NuGet 공식 피드',
|
||
foundryRuntimeSourceOrtNightly: 'Microsoft ORT-Nightly 피드',
|
||
foundryRuntimeSourceDesc: '첫 사용 전 런타임 구성 요소 다운로드 필요.',
|
||
foundrySelectedModel: '선택한 모델',
|
||
foundryActiveModel: '현재 기본 alias',
|
||
foundryLoadedModel: '로드된 모델',
|
||
foundryNotLoaded: '로드되지 않음',
|
||
foundryError: 'Foundry 상태',
|
||
foundrySetDefault: '기본값으로 설정 / Windows 로컬 ASR 활성화',
|
||
foundryEnabling: '활성화 중…',
|
||
foundryPrepare: '준비 / 다운로드 / 로드',
|
||
foundryPreparing: '준비 중…',
|
||
foundryReleasing: '해제 중…',
|
||
foundryRetryPrepare: '준비 계속 / 다시 시도',
|
||
foundryCancelPrepare: '준비 취소',
|
||
foundryCancelRequested: '취소 요청됨',
|
||
foundryCancelling: '취소 중…',
|
||
foundryCancelBestEffort: '취소 요청됨. 현재 단계 완료 후 중지. 나중에 재시도 가능.',
|
||
foundryPrepareRuntime: '런타임 구성 요소 준비',
|
||
foundryPrepareModel: '모델 다운로드',
|
||
foundryPrepareLoad: '모델 로드',
|
||
foundryPrepareModelSkipped: '모델이 이미 다운로드되어 다운로드 단계를 건너뜀',
|
||
foundryPrepareDone: '완료',
|
||
foundryPrepareWaiting: '대기 중',
|
||
foundryApproxSizeMb: '약 {{mb}} MB',
|
||
foundryLanguageLabel: '인식 언어',
|
||
foundryLanguageAuto: '자동',
|
||
foundryLanguageZh: '중국어 zh',
|
||
foundryLanguageEn: '영어 en',
|
||
foundryLanguageDesc: '중국어는 "중문", 혼합 사용은 "자동" 선택.',
|
||
foundryModelSmall: 'Whisper Small(기본 / 균형)',
|
||
foundryModelSmallDesc: '품질과 리소스 사용량을 균형 있게 맞춘 기본 옵션.',
|
||
foundryModelMedium: 'Whisper Medium(더 높은 품질)',
|
||
foundryModelMediumDesc: '더 높은 정확도. 더 큰 다운로드와 느린 추론을 감당할 수 있는 고성능 기기에 적합합니다.',
|
||
foundryModelLarge: 'Whisper Large V3 Turbo(최고 품질)',
|
||
foundryModelLargeDesc: '고성능 기기와 품질 우선 사용에 맞는 대형 모델 옵션.',
|
||
foundryModelBase: 'Whisper Base(더 빠름 / 낮은 리소스)',
|
||
foundryModelBaseDesc: '더 빠르고 리소스를 적게 사용해 가벼운 일상 받아쓰기에 적합합니다.',
|
||
foundryModelTiny: 'Whisper Tiny(가장 빠름 / 스모크 테스트)',
|
||
foundryModelTinyDesc: 'Foundry 경로가 작동하는지 확인하기 위한 가장 빠른 옵션.',
|
||
sherpaTitle: 'Windows sherpa-onnx Local(실험적)',
|
||
sherpaDesc: 'Windows는 sherpa-onnx로 기기 내 오프라인 일괄 인식을 수행하며 ASR API 키가 필요 없습니다.',
|
||
sherpaRuntimeReady: '모델 로드됨',
|
||
sherpaRuntimeMissing: '모델 로드되지 않음',
|
||
sherpaSetDefault: '기본값으로 설정 / sherpa-onnx 활성화',
|
||
sherpaPrepare: '로컬 파일 확인 / 로드',
|
||
sherpaPreparing: '로드 중…',
|
||
sherpaPrepareLocalFiles: '로컬 모델 파일 확인',
|
||
sherpaModelDir: '모델 디렉터리',
|
||
sherpaRevealDir: '모델 디렉터리 열기',
|
||
sherpaError: 'sherpa-onnx 상태',
|
||
sherpaLanguageJa: '일본어 ja',
|
||
sherpaLanguageKo: '한국어 ko',
|
||
sherpaLanguageYue: '광둥어 yue',
|
||
sherpaModelSenseVoice: 'SenseVoice Small(기본 / 중국어 우선)',
|
||
sherpaModelSenseVoiceDesc: '중국어 및 중영 혼합 받아쓰기에 적합한 기본 실험 모델.',
|
||
sherpaModelParaformer: 'Paraformer 중국어',
|
||
sherpaModelParaformerDesc: '중국어 중심 실험 모델.',
|
||
sherpaModelWhisper: 'Whisper Small 다국어',
|
||
sherpaModelWhisperDesc: 'Whisper 계열 동작에 맞춘 다국어 실험 폴백 모델.',
|
||
sherpaModelWhisperLargeV3: 'Whisper Large V3 (다국어)',
|
||
sherpaModelWhisperLargeV3Desc: '오픈소스 다국어 모델 중 품질이 가장 좋은 Whisper 계열. 고품질이지만 용량이 큽니다.',
|
||
sherpaModelQwen3: 'Qwen3-ASR 0.6B INT8',
|
||
sherpaModelQwen3Desc: '변환된 sherpa-onnx Qwen3-ASR 모델로 다국어 인식과 더 강한 긴 문맥 처리를 지원합니다.',
|
||
modelSelectTitle: '모델 선택',
|
||
modelSelectDesc: '다운로드된 모델 중 현재 인식 모델을 고릅니다. 추가는 아래 「다운로드 및 관리」에서.',
|
||
modelSelectPlaceholder: '다운로드된 모델 선택…',
|
||
modelSelectEmpty: '다운로드된 모델이 없습니다. 「다운로드 및 관리」에서 받으세요.',
|
||
groupDownload: '다운로드 및 관리',
|
||
groupOther: '기타',
|
||
mirrorLabel: '다운로드 미러',
|
||
mirrorDesc: '공식 소스는 해외 네트워크에서 안정적; hf-mirror.com 은 중국 커뮤니티가 운영하는 미러.',
|
||
mirrorHuggingface: 'HuggingFace 공식 (huggingface.co)',
|
||
mirrorHfMirror: '중국 미러 (hf-mirror.com)',
|
||
activeBadge: '사용 중',
|
||
downloadedBadge: '다운로드됨',
|
||
notDownloadedBadge: '다운로드되지 않음',
|
||
download: '다운로드',
|
||
resume: '계속 다운로드',
|
||
cancel: '취소',
|
||
delete: '삭제',
|
||
setActive: '기본으로 설정',
|
||
failed: '실패',
|
||
cancelled: '취소됨',
|
||
files: '파일',
|
||
sizeLoading: '크기 조회 중…',
|
||
sizeUnknown: '크기 알 수 없음',
|
||
performanceWarning: '로컬 ASR 은 오프라인 또는 개인정보 보호 시나리오에 적합. 첫 사용 시 모델 다운로드 필요.',
|
||
test: '로드하여 테스트',
|
||
testRunning: '테스트 중…',
|
||
testHeading: '내장 오디오 테스트',
|
||
testExpected: '원문',
|
||
testActual: '인식',
|
||
testStats: '오디오 길이 {{audio}}s · 로드 {{load}}s · 추론 {{transcribe}}s · 백엔드 {{backend}}',
|
||
testFailed: '테스트 실패',
|
||
engineStatusLabel: '메모리에 있는 엔진',
|
||
engineLoaded: '로드됨: {{model}}(약 1.2-3.4 GB 메모리 사용)',
|
||
engineUnloaded: '로드되지 않음(첫 받아쓰기 시 약 3-5 초 로드 필요)',
|
||
loadNow: '지금 로드',
|
||
releaseNow: '지금 해제',
|
||
keepLoadedLabel: '로드 유지 시간',
|
||
keepLoadedDesc: '로컬 ASR 사용 후 메모리에서 해제되기까지의 시간을 결정. 1+ GB RAM 장기 점유 회피.',
|
||
keepImmediate: '말하기 직후 해제',
|
||
keep1min: '마지막 사용 후 1분',
|
||
keep5min: '마지막 사용 후 5분(기본)',
|
||
keep30min: '마지막 사용 후 30분',
|
||
keepForever: '해제하지 않음(항상 유지)',
|
||
},
|
||
};
|